fixError method

bool fixError(
  1. int start_token,
  2. int error_token
)

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);
}