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']'
是等效的,因此可以不使用括号。我不知道你为什么认为它们不同。你能帮我回答下面的问题吗?