recover method

int recover(
  1. int marker_token,
  2. int error_token
)

Implementation

int recover(int marker_token, int error_token) {
  if (stateStack.isEmpty) reallocateStacks();

  //
  //
  //
  tokens.reset();
  tokStream.reset();
  tokens.add(tokStream.getPrevious(tokStream.peek()));
  var restart_token =
          (marker_token != 0 ? marker_token : tokStream.getToken()),
      old_action_size = 0;
  stateStackTop = 0;
  stateStack[stateStackTop] = START_STATE;

  do {
    action.reset(old_action_size);
    if (!fixError(restart_token, error_token)) {
      throw BadParseException(error_token);
    }

    //
    // if the parser needs to stop processing,
    // it may do so here.
    //
    if (monitor != null && monitor!.isCancelled()) break;

    //
    // At this stage, we have a recovery configuration. See how
    // far we can go with it.
    //
    restart_token = error_token;
    tokStream.reset(error_token);
    old_action_size =
        action.size(); // save the old size in case we encounter a new error
    error_token = parser.backtrackParse(stateStack, stateStackTop, action, 0);
    tokStream.reset(tokStream.getNext(restart_token));
  } while (error_token != 0); // no error found

  return restart_token;
}