parseEntry method

Object? parseEntry([
  1. int marker_kind = 0,
  2. int max_error_count = 0
])

Implementation

Object? parseEntry([int marker_kind = 0, int max_error_count = 0]) {
  action.reset();
  tokStream.reset(); // Position at first token.
  reallocateStateStack();
  stateStackTop = 0;
  stateStack[0] = START_STATE;

  skipTokens = max_error_count < 0;

  if (max_error_count > 0 && tokStream is IPrsStream) max_error_count = 0;

  //
  // The tuple tokens will eventually contain the sequence
  // of tokens that resulted in a successful parse. We leave
  // it up to the "Stream" implementer to define the predecessor
  // of the first token as he sees fit.
  //
  tokens = IntTuple(tokStream.getStreamLength());
  tokens.add(tokStream.getPrevious(tokStream.peek()));

  var start_token_index = tokStream.peek(),
      repair_token = getMarkerToken(marker_kind, start_token_index),
      start_action_index = action.size(); // obviously 0
  var temp_stack = List.filled(stateStackTop + 1, 0);
  ArrayList.copy(stateStack, 0, temp_stack, 0, temp_stack.length);

  var initial_error_token = backtrackParseInternal(action, repair_token);
  for (var error_token = initial_error_token, count = 0;
      error_token != 0;
      error_token = backtrackParseInternal(action, repair_token), count++) {
    if (count == max_error_count) {
      throw BadParseException(initial_error_token);
    }
    action.reset(start_action_index);
    tokStream.reset(start_token_index);
    stateStackTop = temp_stack.length - 1;
    ArrayList.copy(temp_stack, 0, stateStack, 0, temp_stack.length);
    reallocateOtherStacks(start_token_index);

    backtrackParseUpToError(repair_token, error_token);

    for (stateStackTop = findRecoveryStateIndex(stateStackTop);
        stateStackTop >= 0;
        stateStackTop = findRecoveryStateIndex(stateStackTop - 1)) {
      var recovery_token = tokens.get(locationStack[stateStackTop] - 1);
      repair_token = errorRepair(
          tokStream as IPrsStream,
          (recovery_token >= start_token_index
              ? recovery_token
              : error_token),
          error_token);
      if (repair_token != 0) break;
    }

    if (stateStackTop < 0) throw BadParseException(initial_error_token);

    temp_stack = List.filled(stateStackTop + 1, 0);
    ArrayList.copy(stateStack, 0, temp_stack, 0, temp_stack.length);

    start_action_index = action.size();
    start_token_index = tokStream.peek();
  }

  if (repair_token != 0) tokens.add(repair_token);
  int t;
  for (t = start_token_index;
      tokStream.getKind(t) != EOFT_SYMBOL;
      t = tokStream.getNext(t)) {
    tokens.add(t);
  }
  tokens.add(t);

  return parseActions(marker_kind);
}