Следующие альтернативы никогда не могут быть достигнуты: 2 - PullRequest
6 голосов
/ 10 июня 2011

Я пытаюсь создать очень простую грамматику, чтобы научиться использовать ANTLR, но получаю следующее сообщение:

"Следующие альтернативы никогда не могут быть достигнуты: 2"

Это моя попытка грамматики:

grammar Robot;

file    :   command+;
command :   ( delay|type|move|click|rclick) ;
delay   :   'wait' number ';';
type    :   'type' id ';';
move    :   'move' number ',' number ';';
click   :   'click' ;
rclick  :   'rlick' ;
id  :       ('a'..'z'|'A'..'Z')+ ;
number  :       ('0'..'9')+ ;
WS  :   (' ' | '\t' | '\r' | '\n' ) { skip();} ;

Я использую плагин ANTLRWorks для IDEA:

This is what it looks like

1 Ответ

4 голосов
/ 10 июня 2011

.. (диапазон) внутри правил синтаксического анализатора означает нечто иное, чем внутри правил лексера. Внутри правил лексера это означает: «от символа X к символу Y», а внутри правила синтаксического анализатора оно соответствует «от токена M до токена N». И поскольку вы сделали number правилом синтаксического анализа, оно не выполняет то, что, по вашему мнению, оно выполняет (и поэтому получает неясное сообщение об ошибке).

Решение: вместо этого сделайте number правилом лексера (поэтому используйте его с заглавной буквы: Number):

grammar Robot;

file    :   command+;
command :   (delay | type | move | Click | RClick) ;
delay   :   'wait' Number ';';
type    :   'type' Id ';';
move    :   'move' Number ',' Number ';';
Click   :   'click' ;
RClick  :   'rlick' ;
Id      :   ('a'..'z'|'A'..'Z')+ ;
Number  :   ('0'..'9')+ ;
WS      :   (' ' | '\t' | '\r' | '\n') { skip();} ;

И, как вы можете видеть, я также вместо этого создал правила id, click и rclick lexer. Если вы не уверены, в чем разница между правилами парсера и лексера, скажите об этом, и я добавлю пояснение к этому ответу.

...