У меня есть грамматика на Antlr4.Я пытаюсь реализовать пользовательские прослушиватели ошибок (чтобы захватить все синтаксические ошибки в элементе управления пользовательского интерфейса).
Я следовал рекомендациям по реализации:
class ReaderErrorListener : IAntlrErrorListener<IToken>
{
public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
System.Diagnostics.Debug.WriteLine("Invalid Expressions: line {0}:{1} - {2}", line, charPositionInLine, msg);
}
}
И зарегистрировал прослушиватель на моемсинтаксический анализатор:
string str = "writqwee(path.subnode.field, 0xa5)";
var lexer = new ReaderLexer(new AntlrInputStream(str));
var tokens = new CommonTokenStream(lexer);
var parser = new ReaderParser(tokens);
parser.RemoveErrorListeners();
parser.AddErrorListener(new ReaderErrorListener());
var tree = parser.root();
Допустимый ввод для моего синтаксического анализатора - write(path.subnode.field, 0xa5)
, поэтому ожидается, что вышеуказанный ввод будет синтаксической ошибкой.
Переменная tree
пуста (как и ожидалось), но метод SyntaxError
никогда не вызывается.
В моей грамматике слово "запись" идентифицируется как правило лексера ...
TWO_ARG_KEYWORD :
'write'
;
Я просмотрел и выполнил Как собирать ошибки во время выполнения, заданные анализатором в Antlr4 , но безуспешно.
Чего мне не хватает?