【问题标题】:The following alternatives can never be reached: 2永远无法达到以下替代方案:2
【发布时间】:2011-09-12 18:12:25
【问题描述】:

我正在尝试创建一个非常简单的语法来学习使用 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 插件:

【问题讨论】:

    标签: java antlr grammar antlrworks


    【解决方案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();} ;
    

    如您所见,我还创建了idclickrclick 词法分析器规则。如果您不确定解析器规则和词法分析器规则之间有什么区别,请说出来,我会在这个答案中添加解释。

    【讨论】:

    • 顺便说一句,NumberNUMBER 的约定是什么?
    • @Oscar,没有真正的约定。但是,在稍后阶段(更复杂的语法),您可能会使用所谓的“虚构标记”,我喜欢将其与“正常”标记区分开来。所以我对虚构的标记使用全大写,对“正常”标记使用单个大写(标记 == 词法分析器规则)。不管你喜欢什么......
    • 如果您不确定解析器规则和词法分析器规则之间有什么区别,请说出来,我会在这个答案中添加解释。 其实我不知道t :PI 认为我知道,但我不介意阅读您的解释
    • 我正要为此创建一个新问题,但我发现:stackoverflow.com/questions/4297770/…
    • @Oscar,我永远找不到我以前的答案,所以我正要编辑我当前的答案并添加解释! :) 很高兴看到你可以在 SO 上找到东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多