fixError method
Implementation
bool fixError(int start_token, int error_token) {
//System.err.println("fixError entered on error token " + error_token + " ==> " + tokStream.getName(error_token) +
// " in state " + originalState(stateStack[stateStackTop]) +
// " to restart on token " + tokStream.peek() + " ==> " + tokStream.getName(tokStream.peek()));
//
// Save information about the current configuration.
//
var curtok = start_token,
current_kind = tokStream.getKind(curtok),
first_stream_token = tokStream.peek();
buffer[1] = error_token;
buffer[0] = tokStream.getPrevious(buffer[1]);
for (var k = 2; k < BUFF_SIZE; k++) {
buffer[k] = tokStream.getNext(buffer[k - 1]);
}
scope_repair.distance = 0;
scope_repair.misspellIndex = 0;
scope_repair.bufferPosition = 1;
//
// Clear the configuration stack.
//
main_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 stored in the "action" tuple.
//
locationStack[stateStackTop] = curtok;
actionStack[stateStackTop] = action.size();
var act = tAction(stateStack[stateStackTop], current_kind);
for (;;) {
//
// if the parser needs to stop processing,
// it may do so here.
//
if (monitor != null && monitor!.isCancelled()) return true;
if (act <= NUM_RULES) {
action.add(act); // save this reduce action
stateStackTop--;
do {
stateStackTop -= (rhs(act) - 1);
act = ntAction(stateStack[stateStackTop], lhs(act));
} while (act <= NUM_RULES);
try {
stateStack[++stateStackTop] = act;
} on RangeError {
reallocateStacks();
stateStack[stateStackTop] = act;
}
locationStack[stateStackTop] = curtok;
actionStack[stateStackTop] = action.size();
act = tAction(act, current_kind);
continue;
} else if (act == ERROR_ACTION) {
if (curtok != error_token || main_configuration_stack.size() > 0) {
var configuration = main_configuration_stack.pop();
if (configuration == null) {
act = ERROR_ACTION;
} else {
stateStackTop = configuration.stack_top;
configuration.retrieveStack(stateStack);
act = configuration.act;
curtok = configuration.curtok;
action.reset(configuration.action_length);
current_kind = tokStream.getKind(curtok);
tokStream.reset(tokStream.getNext(curtok));
continue;
}
}
break;
} else if (act > ACCEPT_ACTION && act < ERROR_ACTION) {
if (main_configuration_stack.findConfiguration(
stateStack, stateStackTop, curtok)) {
act = ERROR_ACTION;
} else {
main_configuration_stack.push(
stateStack, stateStackTop, act + 1, curtok, action.size());
act = baseAction(act);
}
continue;
} 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) {
action.add(act); // save this shift-reduce action
curtok = tokStream.getToken();
current_kind = tokStream.getKind(curtok);
act -= ERROR_ACTION;
do {
stateStackTop -= (rhs(act) - 1);
act = ntAction(stateStack[stateStackTop], lhs(act));
} while (act <= NUM_RULES);
} else {
break;
} // assert(act == ACCEPT_ACTION); THIS IS NOT SUPPOSED TO HAPPEN!!!
try {
stateStack[++stateStackTop] = act;
} on RangeError {
reallocateStacks();
stateStack[stateStackTop] = act;
}
if (curtok == error_token) {
scopeTrial(scope_repair, stateStack, stateStackTop);
if (scope_repair.distance >= MIN_DISTANCE) {
//TemporaryErrorDump();
tokens.add(start_token);
for (var token = first_stream_token;
token != error_token;
token = tokStream.getNext(token)) {
tokens.add(token);
}
acceptRecovery(error_token);
break; // equivalent to: return true;
}
}
locationStack[stateStackTop] = curtok;
actionStack[stateStackTop] = action.size();
act = tAction(act, current_kind);
}
}
//if (act != ERROR_ACTION)
//System.err.println("fixError exiting in state " + originalState(stateStack[stateStackTop]) +
// " on symbol " + curtok + " ==> " + tokStream.getName(curtok));
return (act != ERROR_ACTION);
}