/// <summary> /// <inheritDoc/> /// <p>The default implementation returns immediately if the handler is already /// in error recovery mode. Otherwise, it calls /// <see cref="BeginErrorCondition(Parser)"/> /// and dispatches the reporting task based on the runtime type of /// <paramref name="e"/> /// according to the following table.</p> /// <ul> /// <li> /// <see cref="NoViableAltException"/> /// : Dispatches the call to /// <see cref="ReportNoViableAlternative(Parser, NoViableAltException)"/> /// </li> /// <li> /// <see cref="InputMismatchException"/> /// : Dispatches the call to /// <see cref="ReportInputMismatch(Parser, InputMismatchException)"/> /// </li> /// <li> /// <see cref="FailedPredicateException"/> /// : Dispatches the call to /// <see cref="ReportFailedPredicate(Parser, FailedPredicateException)"/> /// </li> /// <li>All other types: calls /// <see cref="Parser.NotifyErrorListeners(string)"/> /// to report /// the exception</li> /// </ul> /// </summary> public virtual void ReportError(Parser recognizer, RecognitionException e) { // if we've already reported an error and have not matched a token // yet successfully, don't report any errors. if (InErrorRecoveryMode(recognizer)) { // System.err.print("[SPURIOUS] "); return; } // don't report spurious errors BeginErrorCondition(recognizer); if (e is NoViableAltException) { ReportNoViableAlternative(recognizer, (NoViableAltException)e); } else { if (e is InputMismatchException) { ReportInputMismatch(recognizer, (InputMismatchException)e); } else { if (e is FailedPredicateException) { ReportFailedPredicate(recognizer, (FailedPredicateException)e); } else { #if !PORTABLE System.Console.Error.WriteLine("unknown recognition error type: " + e.GetType().FullName); #endif NotifyErrorListeners(recognizer, e.Message, e); } } } }