Beispiel #1
0
  private int panicRecover(
      ParseStack stack,
      Stack realStack,
      ITokenStream stream,
      ISyntaxErrorRequestor problemRequestor) {
    // Remember the first token
    int left = stream.getLookAhead().left;
    int right = stream.getLookAhead().right;

    // Dump the entire part
    stack.dumpStackUntil(NodeTypes.part, NodeTypes.RECORD);

    while (stack.getStackTop() != realStack.size() - 1) {
      realStack.pop();
    }

    // Delete the input tokens until we can parse RECOVERY_SUCCESS tokens ahead
    while (true) {
      ParseStack trialStack = stack.createCopy();

      if (trialStack.parseCheck(stream, RECOVERY_SUCCESS) == RECOVERY_SUCCESS) {
        break;
      }

      stream.advanceLookAhead();
    }

    // Only report the panic error if we haven't reported too many already
    if (errorsDetected < MAX_ERRORS) {
      problemRequestor.panicPhrase(left, right);
    }

    // Panic recoveries do not create artificial nodes
    return 0;
  }