zell писал:
Часть грамматики (в ANTLR) не работает, потому что компилятор будет жаловаться, что IDENT никогда не будет достигнут длянекоторый ввод.
Нет, это не правильно.Следующая грамматика:
grammar T;
parse
: .* EOF
;
VAR : ('A'..'Z')+ DIGIT* ;
IDENT : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*;
fragment DIGIT : '0'..'9';
не выдает никаких ошибок или предупреждений.Лексер просто создает два типа токенов:
- , если что-то начинается с одной или нескольких заглавных букв ascii, за которыми следуют ноль или более цифр, создается
VAR
; - , есличто-то начинается с строчной буквы или символа подчеркивания, затем следует
('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*
, создается IDENT
.
Обратите внимание, что для этого IDENT
никогда не может начинаться с заглавной буквы ascii: это будетвсегда становиться VAR
.
Итак, если у вас есть правило синтаксического анализатора, которое выглядит так:
foo
: IDENT
;
и весь ввод "BAR"
, тогда будет ошибка синтаксического анализаторапотому что лексер не будет выдавать токен INDENT
, но токен VAR
, даже если синтаксический анализатор "запрашивает" IDENT
.
Вы должны понимать, что независимо от того, что парсер запрашивает у лексера, лексер работает независимо от парсера.