From ab46bf0f61b5c18acbd3abbf0f8cd42ccd9f9956 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 2 Oct 2010 23:17:03 +0000 Subject: SCI: Allow multiple word groups in parse tree leafs This is to prepare for multilingual SCI versions. In those a single typed word may be parsed to multiple class,group pairs, any of which may match the said specs. The actual parsing is not yet implemented. svn-id: r52985 --- engines/sci/parser/grammar.cpp | 3 +++ engines/sci/parser/said.cpp | 38 +++++++++++++++++++++++++++++++------- engines/sci/parser/vocabulary.cpp | 2 ++ 3 files changed, 36 insertions(+), 7 deletions(-) (limited to 'engines/sci') diff --git a/engines/sci/parser/grammar.cpp b/engines/sci/parser/grammar.cpp index 6f37b49919..ad00397057 100644 --- a/engines/sci/parser/grammar.cpp +++ b/engines/sci/parser/grammar.cpp @@ -445,6 +445,7 @@ static int _vbpt_append(ParseTreeNode *nodes, int *pos, int base, int value) { nodes[base].left = &nodes[++(*pos)]; nodes[*pos].type = kParseTreeLeafNode; nodes[*pos].value = value; + nodes[*pos].right = 0; nodes[base].right = &nodes[++(*pos)]; nodes[*pos].type = kParseTreeBranchNode; nodes[*pos].left = 0; @@ -456,6 +457,7 @@ static int _vbpt_terminate(ParseTreeNode *nodes, int *pos, int base, int value) // Terminates, overwriting a nextwrite forknode nodes[base].type = kParseTreeLeafNode; nodes[base].value = value; + nodes[base].right = 0; return *pos; } @@ -570,6 +572,7 @@ int Vocabulary::parseGNF(const ResultWordList &words, bool verbose) { _parserNodes[1].type = kParseTreeLeafNode; _parserNodes[1].value = 0x141; + _parserNodes[1].right = 0; _parserNodes[2].type = kParseTreeBranchNode; _parserNodes[2].left = 0; diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index 5adf968b9b..7393874856 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -94,6 +94,7 @@ static ParseTreeNode* said_next_node() { static ParseTreeNode* said_leaf_node(ParseTreeNode* pos, int value) { pos->type = kParseTreeLeafNode; pos->value = value; + pos->right = 0; return pos; } @@ -101,6 +102,7 @@ static ParseTreeNode* said_leaf_node(ParseTreeNode* pos, int value) { static ParseTreeNode* said_word_node(ParseTreeNode* pos, int value) { pos->type = kParseTreeWordNode; pos->value = value; + pos->right = 0; return pos; } @@ -780,17 +782,39 @@ static int matchTrees(ParseTreeNode* parseT, ParseTreeNode* saidT) // both saidT and parseT are terminals int said_val = node_terminal_value(saidT); - int parse_val = node_terminal_value(parseT); - if (said_val != WORD_NONE && - (said_val == parse_val || said_val == WORD_ANY || - parse_val == WORD_ANY)) +#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION + scidprintf("%*smatchTrees matching terminals: %03x", outputDepth, "", node_terminal_value(parseT)); + ParseTreeNode* t = parseT->right->right; + while (t) { + scidprintf(",%03x", t->value); + t = t->right; + } + scidprintf(" vs %03x", said_val); +#endif + + if (said_val == WORD_NONE) { + ret = -1; + } else if (said_val == WORD_ANY) { ret = 1; - else + } else { ret = -1; - scidprintf("%*smatchTrees matching terminals: %03x vs %03x (%d)\n", - outputDepth, "", parse_val, said_val, ret); + // scan through the word group ids in the parse tree leaf to see if + // one matches the word group in the said tree + parseT = parseT->right->right; + do { + assert(parseT->type != kParseTreeBranchNode); + int parse_val = parseT->value; + if (parse_val == WORD_ANY || parse_val == said_val) { + ret = 1; + break; + } + parseT = parseT->right; + } while (parseT); + } + + scidprintf(" (ret %d)\n", ret); } else if (node_is_terminal(saidT) && !node_is_terminal(parseT)) { diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 20436d5b30..139787eefc 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -40,6 +40,7 @@ Vocabulary::Vocabulary(ResourceManager *resMan, bool foreign) : _resMan(resMan), // Mark parse tree as unused _parserNodes[0].type = kParseTreeLeafNode; _parserNodes[0].value = 0; + _parserNodes[0].right = 0; _synonyms.clear(); // No synonyms @@ -578,6 +579,7 @@ int Vocabulary::parseNodes(int *i, int *pos, int type, int nr, int argc, const c if (type == kParseNumber) { _parserNodes[*pos += 1].type = kParseTreeLeafNode; _parserNodes[*pos].value = nr; + _parserNodes[*pos].right = 0; return *pos; } if (type == kParseEndOfInput) { -- cgit v1.2.3