backtrackParseInternal method
Implementation
int backtrackParseInternal(IntSegmentedTuple action, int initial_token) {
//
// Allocate configuration stack.
//
var configuration_stack = ConfigurationStack(prs);
//
// Keep parsing until we successfully reach the end of file or
// an error is encountered. The list of actions executed will
// be stored in the "action" tuple.
//
var error_token = 0,
maxStackTop = stateStackTop,
start_token = tokStream.peek(),
curtok = (initial_token > 0 ? initial_token : tokStream.getToken()),
current_kind = tokStream.getKind(curtok),
act = tAction(stateStack[stateStackTop], current_kind);
//
// The main driver loop
//
for (;;) {
//
// if the parser needs to stop processing,
// it may do so here.
//
if (monitor != null && monitor!.isCancelled()) return 0;
if (act <= NUM_RULES) {
action.add(act); // save this reduce action
stateStackTop--;
act = process_backtrack_reductions(act);
} else if (act > ERROR_ACTION) {
action.add(act); // save this shift-reduce action
curtok = tokStream.getToken();
current_kind = tokStream.getKind(curtok);
act = process_backtrack_reductions(act - ERROR_ACTION);
} else if (act < ACCEPT_ACTION) {
action.add(act); // save this shift 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 {
action.reset(configuration.action_length);
act = configuration.act;
curtok = configuration.curtok;
current_kind = tokStream.getKind(curtok);
tokStream.reset(curtok == initial_token
? start_token
: tokStream.getNext(curtok));
stateStackTop = configuration.stack_top;
configuration.retrieveStack(stateStack);
continue;
}
break;
} else if (act > ACCEPT_ACTION) {
if (configuration_stack.findConfiguration(
stateStack, stateStackTop, curtok)) {
act = ERROR_ACTION;
} else {
configuration_stack.push(
stateStack, stateStackTop, act + 1, curtok, action.size());
act = prs.baseAction(act);
maxStackTop =
stateStackTop > maxStackTop ? stateStackTop : maxStackTop;
}
continue;
} else {
break;
} // assert(act == ACCEPT_ACTION);
try {
stateStack[++stateStackTop] = act;
} on RangeError {
reallocateStateStack();
stateStack[stateStackTop] = act;
}
act = tAction(act, current_kind);
}
return (act == ERROR_ACTION ? error_token : 0);
}