关于 ANTLR 中左递归的错误.现在需要做什么?


//Expression
exp: exp1 ASS_OP exp | exp1;
exp1: exp1 OR_OP exp2 | exp2;
exp2: exp2 AND_OP exp3 | exp3;
exp3: exp4 (EQUAL_OP | NOT_EQUAL_OP) exp4 | exp4;
exp4: exp5 (LESS_OP|GREATER_OP|LESS_EQUAL_OP|GREATER_EQUAL_OP) exp5 | exp5;
exp5: exp5 (ADD_OP | SUB_OP) exp6 | exp6;
exp6: exp6 (MUL_OP | DIV_OP | MOD_OP) exp7 | exp7;
exp7: (ADD_OP | SUB_OP | NOT_OP) exp7 | exp8;
exp8: LB exp RB | expl;
expl: invocation_exp | index_exp | ID | INTLIT |FLOATLIT | BOOLEANLIT | STRINGLIT;
index_exp: exp LSB exp RSB;
invocation_exp: ID LB (exp (COMMA exp)*)? RB;

[错误] 错误 (119): MC.g4::: 以下规则集是相互左递归的 [exp, index_exp, exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, expl]

[trace] 堆栈跟踪抑制:最后运行 *:Antlr 为完整输出生成词法分析和解析器。

嗨,我是新来的。我阅读了一些主题,以便ANTLR4仅支持直接左递归。作者似乎不想改变这一点。所以任何人都可以帮我修复我的代码吗?感谢您阅读本文。

与一些较旧的工具相比,ANTLR4的一大优点是,您通常不必像这样"链接"运算符优先级:

exp: exp1 ASS_OP exp | exp1;
exp1: exp1 OR_OP exp2 | exp2;
exp2: exp2 AND_OP exp3 | exp3;

我记得那些为严格的 BNF 语法链接表达式规则的日子。 但是在ANTLR4中,我们可以做得更好,语法也更清晰。 由于规则是从上到下评估的,因此首先列出优先级最高的规则,如以下代码段所示:

expr
: expr POW<assoc=right> expr           #powExpr
| MINUS expr                           #unaryMinusExpr
| NOT expr                             #notExpr
| expr op=(MULT | DIV | MOD) expr      #multiplicationExpr
| expr op=(PLUS | MINUS) expr          #additiveExpr
| expr op=(LTEQ | GTEQ | LT | GT) expr #relationalExpr
| expr op=(EQ | NEQ) expr              #equalityExpr
| expr AND expr                        #andExpr
| expr OR expr                         #orExpr
| atom                                 #atomExpr

这可能会解决运算符优先级问题,而不会与相互左递归争论。 顶部的最高优先级,在此示例中(以及数学惯例)中的幂(幂)在表达式中具有最高的绑定。

相关内容

  • 没有找到相关文章

最新更新