diff options
author | Willem Jan Palenstijn | 2010-10-03 10:49:42 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2010-10-03 10:49:42 +0000 |
commit | f98536eef5b24bf98730c3b555aeb63ed9de0927 (patch) | |
tree | 15fb88e221e8eb64e4fe60e53d64056e57778911 /engines/sci/engine | |
parent | 694758fd2a0e98513c436e02cdf13d690fe9565d (diff) | |
download | scummvm-rg350-f98536eef5b24bf98730c3b555aeb63ed9de0927.tar.gz scummvm-rg350-f98536eef5b24bf98730c3b555aeb63ed9de0927.tar.bz2 scummvm-rg350-f98536eef5b24bf98730c3b555aeb63ed9de0927.zip |
SCI: Allow multiple word groups in parser
In SCI01 and up, each typed word may be interpreted as multiple
class,group pairs. This patch adds support to the vocabulary and
parser. It uses the matcher support added in r52985.
This fixes parser issues in German LSL3, but needs testing.
svn-id: r52989
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/kparse.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index be32b340bb..6a052a582d 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -93,13 +93,13 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { reg_t stringpos = argv[0]; Common::String string = s->_segMan->getString(stringpos); char *error; - ResultWordList words; reg_t event = argv[1]; g_sci->checkVocabularySwitch(); Vocabulary *voc = g_sci->getVocabulary(); voc->parser_event = event; reg_t params[2] = { voc->parser_base, stringpos }; + ResultWordListList words; bool res = voc->tokenizeString(words, string.c_str(), &error); voc->parserIsValid = false; /* not valid */ @@ -109,10 +109,15 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, 1); #ifdef DEBUG_PARSER - debugC(2, kDebugLevelParser, "Parsed to the following blocks:"); - - for (ResultWordList::const_iterator i = words.begin(); i != words.end(); ++i) - debugC(2, kDebugLevelParser, " Type[%04x] Group[%04x]", i->_class, i->_group); + debugC(2, kDebugLevelParser, "Parsed to the following blocks:"); + + for (ResultWordListList::const_iterator i = words.begin(); i != words.end(); ++i) { + debugCN(2, kDebugLevelParser, " "); + for (ResultWordList::const_iterator j = i->begin(); j != i->end(); ++j) { + debugCN(2, kDebugLevelParser, "%sType[%04x] Group[%04x]", j == i->begin() ? "" : " / ", j->_class, j->_group); + } + debugCN(2, kDebugLevelParser, "\n"); + } #endif int syntax_fail = voc->parseGNF(words); |