有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java永远无法实现以下替代方案: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();} ;

我正在为IDEA使用ANTLRWorks插件:

This is what it looks like


共 (1) 个答案

  1. # 1 楼答案

    解析器规则中的..(range)与lexer规则中的不同。在lexer规则中,它的意思是:“从char X到char Y”,在解析器规则中,它匹配“从令牌M到令牌N”。由于您将number作为一个解析器规则,它不会做您认为它会做的事情(因此会收到一条模糊的错误消息)

    解决方案是:将number变成一个lexer规则(因此,将其大写: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();} ;
    

    正如你所看到的,我还制定了idclickrclick词法规则。如果你不确定语法分析器和词法分析器规则之间的区别,请说出来,我将对这个答案进行解释