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