antlr 4听众停在两个地方 - 很奇怪

时间:2014-12-28 15:03:44

标签: antlr4

我正在解析类似SQL的语言。

我想解析完整的SQL语句如:SELECT .. FROM .. WHERE以及一个简单的expr行,它可以是一个函数,where子句,expr和arithmethics。

这是语法的重要部分:

// main rule
parse : (statments)* EOF;


// All optional statements
statments : select_statement
        |   virtual_column_statement
;

    select_statement :  
        SELECT  select_item ( ',' select_item )* 
        FROM    from_cluase  ( ',' from_cluase )*
        (WHERE  where_clause )?
        ( GROUP BY group_by_item (',' group_by_item)* )?
        ( HAVING having_condition (AND having_condition)* )?
        ( ORDER BY order_clause (',' order_clause)* )?
        ( LIMIT limit_clause)? 
        | '(' select_statement ')'

   virtual_column_statement:    
            virtual_column_expression 
;

virtual_column_expression :
            expr
        |   where_clause
        |   function
        |   virtual_column_expression arithmetichOp=('*'|'/'|'+'|'-'|'%') virtual_column_expression
        |   '(' virtual_column_expression ')'
;

virtual_columns效果很好。

选择查询也可以,但在完成后,它也会进入virtual_column_statement。

我希望它选择一个。

我该如何解决这个问题?

修改 经过一些研究后,我发现antlr接受了我的查询并将其分成两个不同的部分。

我该如何解决这个问题?

谢谢, ID

1 个答案:

答案 0 :(得分:2)

您的' virtual_column_statement'似乎是' select_statement'的一部分。我希望你错过了一个&#39 ;;'两条规则之间。

您的大部分' select_statement'子句是可选的,因此在匹配select和from子句之后,如果Antlr认为输入的余额更好地匹配为' virtual_column_statement',那么它将采用该路径。

您的选择是:

1)使您的select_statement更全面,至少与您的' virtual_column_statement';

一样通用

2)在' virtual_column_statement'的开头需要一个关键字。防止Antlr将其视为部分替代;

3)将' virtual_column_statement'在单独的解析器语法中,不要将任何选择输入文本发送给它。