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
This commit is contained in:
parent
4a9f2204c4
commit
ab46bf0f61
3 changed files with 36 additions and 7 deletions
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue