parseForError method
int
parseForError(
- int current_kind
)
Implementation
int parseForError(int current_kind) {
var error_token = 0;
//
// Get next token in stream and compute initial action
//
var curtok = tokStream.getPrevious(tokStream.peek()),
act = tAction(tempStack[tempStackTop], current_kind);
//
// Allocate configuration stack.
//
var configuration_stack = ConfigurationStack(prs);
//
// Keep parsing until we reach the end of file and succeed or
// an error is encountered. The list of actions executed will
// be store in the "action" tuple.
//
for (;;) {
if (act <= NUM_RULES) {
tempStackTop--;
do {
tempStackTop -= (rhs(act) - 1);
act = ntAction(tempStack[tempStackTop], lhs(act));
} while (act <= NUM_RULES);
} else if (act > ERROR_ACTION) {
curtok = tokStream.getToken();
current_kind = tokStream.getKind(curtok);
act -= ERROR_ACTION;
do {
tempStackTop -= (rhs(act) - 1);
act = ntAction(tempStack[tempStackTop], lhs(act));
} while (act <= NUM_RULES);
} else if (act < ACCEPT_ACTION) {
curtok = tokStream.getToken();
current_kind = tokStream.getKind(curtok);
} else if (act == ERROR_ACTION) {
error_token = (error_token > curtok ? error_token : curtok);
var configuration = configuration_stack.pop();
if (configuration == null) {
act = ERROR_ACTION;
} else {
tempStackTop = configuration.stack_top;
configuration.retrieveStack(tempStack);
act = configuration.act;
curtok = configuration.curtok;
// no need to execute: action.reset(configuration.action_length);
current_kind = tokStream.getKind(curtok);
tokStream.reset(tokStream.getNext(curtok));
continue;
}
break;
} else if (act > ACCEPT_ACTION) {
if (configuration_stack.findConfiguration(
tempStack, tempStackTop, curtok)) {
act = ERROR_ACTION;
} else {
configuration_stack.push(tempStack, tempStackTop, act + 1, curtok, 0);
act = baseAction(act);
}
continue;
} else {
break;
} // assert(act == ACCEPT_ACTION);
try {
tempStack[++tempStackTop] = act;
} on RangeError {
reallocateStacks();
tempStack[tempStackTop] = act;
}
act = tAction(act, current_kind);
}
return (act == ERROR_ACTION ? error_token : 0);
}