Antlr:意外行为

标签 antlr

为什么要这么简单的语法

grammar Test;

expr
    :    Int | expr '+' expr;

Int
:    [0-9]+;

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

最佳答案

看来我有一段时间没有使用 ANTLR 了……ANTLRv3 支持左递归规则,but ANTLRv4 does support immediate left recursion .它还支持您在帖子中使用的类似正则表达式的字符类语法。我测试了这个版本,它可以在 ANTLRWorks2 中运行(在 ANTLR4 上运行):

grammar Test;

start : expr
      ;
expr  : expr '+' expr
      | INT
      ;
INT   : [0-9]+
      ;

如果您添加start 规则,那么ANTLR 能够推断出EOF 位于该规则的末尾。它似乎无法为 exprexpr2 等更复杂的规则推断 EOF,因为它们是递归的...


下面有很多评论,所以这里是(ANTLR4的合著者)Sam Harwell的回复(强调已加):

You still want to include an explicit EOF in the start rule. The problem the OP faced with using expr directly is ANTLR 4 internally rewrote it to be expr[int _p] (it does so for all left recursive rules), and the included TestRig is not able to directly execute rules with parameters. Adding a start rule resolves the problem because TestRig is able to execute that rule. :)

我已经发布了关于 EOF 的后续问题:When is EOF needed in ANTLR 4?

关于Antlr:意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17840653/

相关文章:

c - 什么时候使用解析器生成器是可行的?

code-generation - 从 Antlr 语法生成语法正确的句子

error-handling - 如何处理Antlr中的错误

java - Gradle srcDirs 路径

ANTLR 和空字符串的矛盾行为

visual-studio-2010 - 如何抑制自动生成文件的 stylecop/fxcop/Visual Studio 代码分析?

java - 在JAVA中使用ANTLR从字符串中获取表达式

ANTLR 3.x - 如何格式化重写规则

c - 我的 C 语法存在许多多重选择错误

java - 如何在 ANTLR 中处理左联想语法