我正在尝试创建一个非常简单的语法以学习使用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:
最佳答案
解析器规则内部的..
(范围)与词法分析器规则内部的含义有所不同。在词法分析器规则内部,它的意思是:“从字符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
词法分析器规则。如果您不确定解析器规则和词法分析器规则之间的区别是什么,请这样说,我将在此答案中添加解释。关于java - 永远无法达到以下替代方法: 2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6311125/