antlr - 用简单计算器实现互左递归

标签 antlr

当我尝试编译 antlr4 计算器语法时,结果发现它是递归的。我需要更改它以使其正确。

我尝试重写规则并使用不同的括号位置,但它们都不起作用。这是我最新版本的错误规则:

解析器:

expression: INT | DECIMAL | arithmetic;
arithmetic: expression OPERATION expression;

词法分析器:

OPERATION: SUB | ADD | MULT | DIV;
SUB: '-';
ADD: '+';
MULT: '*';
DIV: '/';
DPOINT: '.';
INT: SUB? NUMBER+;
DECIMAL: SUB? NUMBER+ DPOINT NUMBER+;

我预计编译会成功,但是出现以下错误:

ANTLR Tool v4.4 (/tmp/antlr-4.4-complete.jar)
hZH.g4 -o /home/heng/workspace/Ultimate ZH Compiler/target/generated-sources/antlr4 -listener -no-visitor -encoding UTF-8
error(119): hZH.g4::: The following sets of rules are mutually left-recursive [expression, arithmetic]
1 error(s)

BUILD FAIL

如何更改规则才能成功构建?

最佳答案

不支持间接左递归规则,但支持直接左递归。所以试试这个:

expression
 : expression OPERATION expression
 | INT 
 | DECIMAL
 ;

我不会让词法分析器将 - 与数字匹配,而是让解析器处理它,如下所示:

expression
 : SUB expression
 | expression ( MULT | DIV ) expression
 | expression ( ADD | SUB ) expression
 | INT 
 | DECIMAL
 | OPAR expression CPAR
 ;

SUB: '-';
ADD: '+';
MULT: '*';
DIV: '/';
INT: NUMBER+;
DECIMAL: NUMBER+ '.' NUMBER+;
OPAR: '(';
CPAR: ')';

另请注意,我通过将 */ 移至 +- 之上,赋予了它们更高的优先级。

关于antlr - 用简单计算器实现互左递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55982676/

相关文章:

java - ANTLR 匹配日期范围

java - ANTLR - 输入错误不匹配

javascript - ANTLR 3 中针对 Javascript 的表达式解析器

parsing - 在 ANTLR 中以非贪婪的方式匹配特定数量的重复

java - 带数字的antlr4语法字符串

c# - 通过 ANTLR 和 DLR 扩展 C#

java - ANTLRv4 TestRig 无法找到我的 Lexer 类

compiler-construction - ANTLR树有必要吗?

java - ANTLR:多个 AST 使用相同的歧义语法?

java - 如何确定哪个解析器规则调用了方法?