在ANTLR4中左递归

时间:2015-07-12 17:31:20

标签: 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+ ;
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}

1 个答案:

答案 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) ])