永远无法达到以下替代方案:2

Osc*_*Ryz 6 java grammar antlr antlrworks

我正在尝试创建一个非常简单的语法来学习使用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();} ;
Run Code Online (Sandbox Code Playgroud)

我正在使用IDEA的ANTLRWorks插件:

这就是它的样子

Bar*_*ers 4

解析器内部规则..的(范围)含义与词法分析器内部规则不同。在词法分析器规则中,它意味着:“从 char X 到 char 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();} ;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我还制作了id,clickrclick词法分析器规则。如果您不确定解析器规则和词法分析器规则之间有什么区别,请说出来,我将对此答案添加解释。