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

标签 java antlr grammar 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();} ;

我正在为 IDEA 使用 ANTLRWorks 插件:

This is what it looks like

最佳答案

解析器规则中的 ..(范围)与词法分析器规则中的含义不同。在词法分析器规则中,它表示:“从字符 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 词法分析器规则。如果您不确定解析器规则和词法分析器规则之间的区别,请说出来,我将对此答案添加解释。

关于java - 永远无法达到以下替代方案 : 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311125/

相关文章:

java - JUNG:绘制后将 child 添加到 DelegateTree

antlr - 解析器规则中不能使用范围元素?

java - 结合 ANTLR 和代码文件

grammar - 上下文无关语言中的 "free"在概念上是什么意思?

c++ - C++ 语法演化是如何管理的?

java - 如何在android中获取IMEI、LAC/CELLID

java - 在什么情况下 JVM 会决定增加堆的大小?

java - 如何限制antlr3中 token 的长度?

javascript - 为什么 <!-- 不会抛出语法错误?

java - Glassfish 4 服务上的 Jersey 实体数据过滤