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

Я пытаюсь создать очень простую грамматику, чтобы научиться использовать 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:

Вот как это выглядит


person OscarRyz    schedule 10.06.2011    source источник


Ответы (1)


.. (диапазон) внутри правил парсера означает нечто иное, чем внутри правил лексера. Внутри правил лексера это означает: «от символа 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. Если вы не уверены, в чем разница между правилами парсера и лексера, скажите об этом, и я добавлю объяснение к этому ответу.

person Bart Kiers    schedule 10.06.2011
comment
Кстати, какое соглашение Number или NUMBER? - person OscarRyz; 10.06.2011
comment
@ Оскар, нет никакой условности. Однако на более позднем этапе (более сложные грамматики) вы, вероятно, будете использовать так называемые воображаемые токены, которые мне нравится отличать от обычных токенов. Поэтому я использую заглавные буквы для воображаемых токенов и одну заглавную для обычных токенов (правило токен == лексера). Хотя, что бы тебе ни нравилось... - person Bart Kiers; 10.06.2011
comment
Если вы не уверены, в чем разница между правилами парсера и лексера, скажите об этом, и я добавлю объяснение к этому ответу. На самом деле я не знаю :PI думаю< /i> Я знаю, но я был бы не против прочитать ваше объяснение - person OscarRyz; 10.06.2011
comment
Я собирался создать новый вопрос для этого и нашел: stackoverflow.com/questions/4297770/ - person OscarRyz; 10.06.2011
comment
@ Оскар, я никак не могу найти ни один из своих предыдущих ответов, поэтому я собирался отредактировать свой текущий ответ и добавить объяснение! :) Приятно видеть, что вы можете найти материал на SO! - person Bart Kiers; 10.06.2011
comment
То же самое происходит и со мной. Я думаю, что поиск при создании вопроса немного отличается от обычного поиска. По крайней мере у меня такое впечатление. - person OscarRyz; 11.06.2011
comment
Я спросил на мета-meta.stackexchange.com/questions/94674/ - person OscarRyz; 11.06.2011
comment
Спасибо, будем следить. - person Bart Kiers; 11.06.2011