3

为什么这个简单的语法

grammar Test;

expr
    :    Int | expr '+' expr;

Int
:    [0-9]+;

与输入不匹配1+1?它说“没有规则 expr 的方法或它有参数”,但我认为它应该匹配。

4

2 回答 2

3

看来我有一段时间没有使用 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 能够执行该规则。:)

我已经发布了一个后续问题EOFANTLR 4 中何时需要 EOF?

于 2013-07-24T17:16:25.297 回答
1

如果您的命令如下所示:

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,应该打印。xxxxxx其作为语法中的第一条规则来防止这种情况发生。

于 2015-01-04T06:50:01.300 回答