用简单的计算器互左递归
Mutually left recursive with simple calculator
当我尝试编译我的 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: ')';
另请注意,我通过将 *
和 /
移至 +
和 -
之上来赋予它们更高的优先级。
当我尝试编译我的 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: ')';
另请注意,我通过将 *
和 /
移至 +
和 -
之上来赋予它们更高的优先级。