由于左递归而导致的 ANTLR 失败.如何解决



这是SQL选择语句的简单语法

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_query定义以及attribute_list定义。老实说,我一开始在我的代码中没有看到任何左递归。

谁能解释一下发生了什么?

不,ANTLR没有说你的语法是左递归的。它抱怨由于递归规则调用,某些规则具有非LL(*)决策。按如下方式重写以下规则,您将没事:

sql_query
    : select_statement from_statement where_statement?
    ;
attribute_list
    : '*'
    | attribute_name (',' attribute_list?)?
    ;

相关内容

  • 没有找到相关文章

最新更新