为什么这个简单的语法
grammar Test;
expr
: Int | expr '+' expr;
Int
: [0-9]+;
与输入不匹配1+1
?它说“没有规则 expr 的方法或它有参数”,但我认为它应该匹配。
为什么这个简单的语法
grammar Test;
expr
: Int | expr '+' expr;
Int
: [0-9]+;
与输入不匹配1+1
?它说“没有规则 expr 的方法或它有参数”,但我认为它应该匹配。
看来我有一段时间没有使用 ANTLR 了…… ANTLRv3不支持左递归规则,但 ANTLRv4 确实支持立即左递归。它还支持您在帖子中使用的类似正则表达式的字符类语法。我测试了这个版本,它适用于 ANTLRWorks2(在 ANTLR4 上运行):
grammar Test;
start : expr
;
expr : expr '+' expr
| INT
;
INT : [0-9]+
;
如果您添加start
规则,那么 ANTLR 能够推断出EOF
该规则的末尾。它似乎无法推断出EOF
更复杂的规则,例如expr
并且expr2
因为它们是递归的......
下面有很多评论,所以这里是(ANTLR4 的合著者)Sam Harwell 的回应(强调添加):
您仍然希望在开始规则中包含显式 EOF。OP 直接使用 expr 面临的问题是ANTLR 4 在内部将其重写为 expr[int _p](它对所有左递归规则都这样做),并且包含的 TestRig 无法直接执行带参数的规则。添加启动规则可以解决问题,因为 TestRig 能够执行该规则。:)
我已经发布了一个后续问题EOF
:ANTLR 4 中何时需要 EOF?
如果您的命令如下所示:
grun MYGRAMMAR xxx -tokens
并抛出此异常:
No method for rule xxx or it has arguments
然后这个异常会被你在上面命令中指定的规则抛出。这意味着该规则可能不存在。
System.err.println("No method for rule "+startRuleName+" or it has arguments");
所以在这里,如果它不是语法中的第一个(开始)规则startRuleName
,应该打印。xxx
将xxx
其作为语法中的第一条规则来防止这种情况发生。