Курс валют Я работаю над своей собственной грамматикой, и я хотел бы, чтобы у меня были конкретные сообщения об ошибках на NoViableAlternative
, InputMismatch
, UnwantedToken
, MissingToken
и LexerNoViableAltException
.
Я ужерасширен Lexer.class
и переопределил notifyListeners
, чтобы изменить сообщение об ошибке по умолчанию token recognition error at:
на мое собственное.Также я расширил DefaultErrorStrategy
и переопределил все методы отчета, такие как reportNoViableAlternative
, reportInputMismatch
, reportUnwantedToken
, reportMissingToken
.
Цель всего, что заключается в изменении сообщений, которыебудет передан методу syntaxError()
слушателя ANTLRErrorListener
.
Вот небольшой пример расширенного Lexer.class
:
@Override
public void notifyListeners(LexerNoViableAltException lexerNoViableAltException) {
String text = this._input.getText(Interval.of(this._tokenStartCharIndex, this._input.index()));
String msg = "Operator " + this.getErrorDisplay(text) + " is unkown.";
ANTLRErrorListener listener = this.getErrorListenerDispatch();
listener.syntaxError(this, null, this._tokenStartLine, this._tokenStartCharPositionInLine, msg,
lexerNoViableAltException);
}
Или для DefaultErrorStrategy
:
@Override
protected void reportNoViableAlternative(Parser recognizer, NoViableAltException noViableAltException) {
TokenStream tokens = recognizer.getInputStream();
String input;
if (tokens != null) {
if (noViableAltException.getStartToken().getType() == -1) {
input = "<EOF>";
} else {
input = tokens.getText(noViableAltException.getStartToken(), noViableAltException.getOffendingToken());
}
} else {
input = "<unknown input>";
}
String msg = "Invalid operation " + input + ".";
recognizer.notifyErrorListeners(noViableAltException.getOffendingToken(), msg, noViableAltException);
}
Итак, я прочитал эту ветку Обработка ошибок в ANTLR4 , и мне было интересно, нет ли более простого решения, когда дело доходит до настройки?