Я пытаюсь разработать новый язык с Antlr. Вот мой файл грамматики:Antlr4 как обнаружить непризнанный токен и данное предложение недопустимо
grammar test;
program : vr'.' to'.' e
;
e: be
| be'.' top'.' be
;
be: 'fg'
| 'fs'
| 'mc'
;
to: 'n'
| 'a'
| 'ev'
;
vr: 'er'
| 'fp'
;
top: 'b'
| 'af'
;
Whitespace : [ \t\r\n]+ ->skip
;
Main.java
String expression = "fp.n.fss";
//String expression = "fp.n.fs.fs";
ANTLRInputStream input = new ANTLRInputStream(expression);
testLexer lexer = new testLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
testParser parser = new testParser(tokens);
//remove listener and add listener does not work
ParseTree parseTree = parser.program();
Все хорошо для действительных предложений. Но я хочу поймать нераспознанные токены и недействительные предложения, чтобы возвращать содержательные сообщения. Вот два теста для моей проблемы.
fp.n.fss => anltr gives this error token recognition error at: 's' but i could not handle this error. There are same example error handler class which use BaseErrorListener but in my case it does not work.
fp.n.fs.fs => this sentence is invalid for my grammar but i could not catch. How can i catch invalidations like this sentence?
Прежде всего спасибо за помощь. Но когда я добавляю ваши решения defaulterrorstratgy, все еще существует ошибка распознавания токенов при: 's'. Также методы reportInputMismatch и reportMissingToken не работают для моего случая. Есть ли какие-либо шаги, чтобы избавиться от этой ошибки и напечатать значимые сообщения об ошибках? – Yunus
@yunsk Вы также можете добавить и исправить ошибку в lexer! Эта стратегия ошибок будет обрабатывать ошибки «непризнанных маркеров». Или вы можете добавить и «Ошибка маркера» в конце определения lexer так: ErrorCharacter:. ; Эффект заключается в том, что все не распознанные токены будут попадать в токен, отправить в синтаксический анализатор и вызвать стратегию ошибок в синтаксическом анализаторе. – FDeitelhoff
@FDeitelhoff test case: fp.n.fs.fs результат ниже введите программу, LT (1) = fp потребляют [@ 0,0: 12 = 'fp', <4>, 1: 0] программа правил потребляют [@ 1,13: 13 = '.', <6>, 1: 13] правило потребляют [@ 2,14: 18 = 'n', <5>, 1: 14] правило потребляют [@ 3,19: 19 = '.', <6>, 1: 19] правило потреблять [@ 4,20: 27 = 'fs', <1>, 1: 20] программа управления программа выхода, LT (1) =. Есть ли проблема с моей грамматикой? Потому что кажется, что парсер принимает ввод, но это предложение недействительно для моего языка. – Yunus