Recursion 由于左递归,ANTLR失败。如何解决?

Recursion 由于左递归,ANTLR失败。如何解决?,recursion,antlr,ll,left-recursion,Recursion,Antlr,Ll,Left Recursion,下面是SQL select语句的简单语法 grammar SQL; @rulecatch { //We want to stop parsing when SyntaxException is encountered //So we re-throw the exception catch (SyntaxException e) { throw e; } } eval : sql_query ; sql_query

下面是SQL select语句的简单语法

grammar SQL;
@rulecatch {
    //We want to stop parsing when SyntaxException is encountered
    //So we re-throw the exception
    catch (SyntaxException e) {
        throw e;
    }
}

eval 
    :  sql_query
    ;

sql_query
    : select_statement from_statement
    | select_statement from_statement where_statement
    ;

select_statement
    : 'select' attribute_list
    ;

from_statement
    : 'from' table_name
    ;

where_statement
    : 'where' attribute_name operator constant
    ;

attribute_list
    : '*'
    | attribute_name
    | attribute_name ',' attribute_list?
    ;

table_name
    : string_literal
    ;

attribute_name
    : string_literal
    ;

operator
    : '=' | '!=' | '>' | '>=' | '<' | '<=' 
    ;

constant
    : INTEGER
    | '"' string_literal '"'
    ;

fragment DIGIT: '0'..'9';
INTEGER: DIGIT+ ; 
fragment LETTER: 'a'..'z'|'A'..'Z';
string_literal: LETTER | LETTER string_literal;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+  {$channel=HIDDEN;};
语法SQL;
@规则捕获{
//我们希望在遇到SyntaxException时停止解析
//所以我们重新抛出异常
捕获(语法异常e){
投掷e;
}
}
评估
:sql\u查询
;
sql\u查询
:从\u语句中选择\u语句
|从\u语句中选择\u语句,其中\u语句
;
select\u语句
:“选择”属性列表
;
来自联合声明
:“from”表的名称
;
where_语句
:“where”属性_name运算符常量
;
属性列表
: '*'
|属性名称
|属性名称“,”属性列表“?
;
表名称
:string\u literal
;
属性名称
:string\u literal
;
操作人员

: '=' | '!=' | '>' | '>=' | ' 不,ANTLR没有说你的语法是左递归的。它抱怨一些规则由于递归规则调用而具有非LL(*)决策。按如下方式重写以下规则,您就会没事了:

sql_query
    : select_statement from_statement where_statement?
    ;

attribute_list
    : '*'
    | attribute_name (',' attribute_list?)?
    ;

发布准确的错误消息总是好的。