Antlr4 несоответствие ввода (частичное совпадение) - PullRequest
0 голосов
/ 07 июля 2019

В ANTLR4 у меня есть следующая грамматика:

ID : [_a-zA-Z][0-9_a-zA-Z]*;
INT_LITERAL : [0-9]+;
FLOAT_LITERAL :[0-9]+'.'?[0-9]*([eE][-+]?)?[0-9]+;

При разборе строки 123abc я ожидаю ошибку, но вместо этого получаю токены:

123
abc
<EOF>

Я пытался добавить EOF в конце моего выражения int и float,

INT_LITERAL : [0-9]+EOF;
FLOAT_LITERAL :[0-9]+'.'?[0-9]*([eE][-+]?)?[0-9]+EOF;

но даже тогда я получаю какой-то частичный результат анализа

bc
<EOF>

Что я должен изменить, чтобы моя грамматика не принимала строку 123abc?

1 Ответ

2 голосов
/ 07 июля 2019

Ваш лексер дает правильный результат.

Этот тип ошибок должен обрабатываться парсером, а не лексером.У вас есть правило синтаксического анализа, которое принимает INT_LITERAL, за которым следует ID?Я полагаю, что нет.Пусть парсер сделает свою работу.Если правило отсутствует, ожидаемая ошибка будет выдана, но только на этапе синтаксического анализа, а не лексического анализа.

...