Antlr 用简单的计算器相互左递归

Antlr 用简单的计算器相互左递归,antlr,Antlr,当我试图编译我的antlr4计算器语法时,结果证明它是左递归的。我需要更改它以使其正确 我尝试过重写规则并使用不同的括号位置,但它们都不起作用。以下是我最新版本的错误规则: 解析器: expression: INT | DECIMAL | arithmetic; arithmetic: expression OPERATION expression; Lexer: OPERATION: SUB | ADD | MULT | DIV; SUB: '-'; ADD: '+'; MULT: '*';

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

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

解析器:

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

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
 ;
我不会让lexer将
-
匹配到一个数字,而是让解析器来处理,如下所示:

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: ')';
还要注意的是,我将
*
/
移到
+
-
之上,从而赋予了它们更高的优先级