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