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

Recursion 关于ANTLR中的左递归错误。现在需要做什么?,recursion,antlr,antlr4,Recursion,Antlr,Antlr4,[error]error(119):MC.g4:::以下规则集是相互左递归的[exp,index_exp,exp1,exp2,exp3,exp4,exp5,exp6,exp7,exp8,expl] [trace]堆栈跟踪被抑制:最后运行*:Antlr为完整输出生成lexer和解析器 嗨,我是新来的。我阅读了一些主题,因此ANTLR4只支持直接左递归。作者似乎不想改变这一点。有人能帮我修改代码吗?感谢阅读。与一些旧工具相比,ANTLR4的一大优点是,您不必经常像这样“链接”运算符优先级: //Ex

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

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


嗨,我是新来的。我阅读了一些主题,因此ANTLR4只支持直接左递归。作者似乎不想改变这一点。有人能帮我修改代码吗?感谢阅读。

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

//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;
我记得那些为严格的BNF语法链接表达式规则的日子。但在ANTLR4中,我们可以做得更好,语法也更清晰。由于这些规则是自上而下计算的,因此最高的先死规则将首先列出,如下代码段所示:

exp: exp1 ASS_OP exp | exp1;
exp1: exp1 OR_OP exp2 | exp2;
exp2: exp2 AND_OP exp3 | exp3;
expr
:expr POW expr#powExpr
|负表达式#一元最小表达式
|非expr#notExpr
|expr op=(MULT | DIV | MOD)expr#乘法expr
|expr op=(加|减)expr#加法expr
|expr op=(LTEQ | GTEQ | LT | GT)expr#relationalExpr
|expr op=(EQ | NEQ)expr#equalityExpr
|expr和expr#andExpr
|expr或expr#orExpr
|原子#原子xpr

这可能会解决运算符优先级问题,而不会与相互左递归发生冲突。最高优先级在顶部,本例中的幂(按数学约定)在表达式中具有最高绑定。

您好,欢迎来到Stack Overflow,请花点时间浏览一下以了解您在这方面的做法(并获得第一个徽章),阅读如何创建并同时检查,以增加获得反馈和有用答案的机会。这可以改写为:expr'*'expr | expr'+'expr |…等,并将他的答案标记为正确,这是唯一礼貌的:)@duc947。不客气。请投票并接受我的答案,以便其他人也能从中得到同样的帮助,谢谢!expr:expr-POW-expr不是左递归的,这就是我想知道的。
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