我有以下代码:
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
在我的代码的第4行
我曾尝试过:
expr '[' expr ']'// without (
错误消失了,但是当我向规则a[2]
输入expr
时,它有一个错误:
Hello::expr:1:0: mismatched input 'a[2]' expecting {BOOL, ID, INT, FLOAT, STRING}
答案 0 :(得分:0)
我无法重现你提到的错误。
鉴于语法:
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;
一个解析a[2]
和a [ 2 ]
的驱动程序类:
import org.antlr.v4.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
String[] tests = {"a[2]", "a [ 2 ]"};
for (String test : tests) {
HelloLexer lexer = new HelloLexer(new ANTLRInputStream(test));
HelloParser parser = new HelloParser(new CommonTokenStream(lexer));
System.out.println(parser.expr().toStringTree(parser));
}
}
}
将两次打印(expr (expr a) [ (expr 2) ])
。