Recursion ANTLR4中的左递归

Recursion ANTLR4中的左递归,recursion,antlr4,Recursion,Antlr4,我有以下代码: grammar Hello; expr : expr ('*'|'/') expr | expr ('+'|'-') expr | (expr '[' expr ']') | ID | INT ; ID : ID_LETTER (ID_LETTER | DIGIT)* ; // INDENTIFIER fragment ID_LETTER : [a-z] | [A-Z] | '_' ; fragment DIGIT : [0-9] ; INT : DIGIT+

我有以下代码:

grammar Hello;
expr :  expr ('*'|'/') expr
|   expr ('+'|'-') expr
|   (expr '[' expr ']')
|   ID
|   INT
;
ID : ID_LETTER (ID_LETTER | DIGIT)* ;  // INDENTIFIER
fragment ID_LETTER : [a-z] | [A-Z] | '_' ;
fragment DIGIT : [0-9] ;
INT : DIGIT+ ;
WS  : [ \t\r\n]+ -> skip;
我想构建索引表达式,但有一个错误:

mutually left-recursive
在我代码的第四行

我试过:

expr '[' expr ']'// without (
错误消失了,但当我将输入:
a[2]
放入规则
expr
时,它有一个错误:

Hello::expr:1:0: mismatched input 'a[2]' expecting {BOOL, ID, INT, FLOAT, STRING}

我无法重现你提到的错误

考虑到语法:

语法你好; expr :expr(“*”|“/”)expr |expr('+'|'-')expr |expr'['expr']' |身份证 |INT ; ID:ID字母(ID字母|数字)*;//识别器 碎片ID_字母:[a-z]|[a-z]|'|; 碎片数字:[0-9]; 整数:数字+; WS:[\t\r\n]+->跳过; 和一个驱动程序类,它同时解析
a[2]
a[2]

import org.antlr.v4.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
String[]tests={“a[2],“a[2]”};
用于(字符串测试:测试){
HelloLexer lexer=新的HelloLexer(新的AntlInputStream(测试));
HelloParser parser=newhelloparser(newcommontokenstream(lexer));
System.out.println(parser.expr().toStringTree(parser));
}
}
}

将打印两次
(expr(expr a)[(expr 2)])

这是一个已知的错误:。但是,
(expr'['expr']')
expr'['expr']'
是等效的,因此可以不使用括号。我不知道你为什么认为它们不同。你能帮我回答下面的问题吗?