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

  • 本文关键字:两个 奇怪 ANTLR antlr4
  • 更新时间 :
  • 英文 :


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

我想解析完整的SQL句子,例如:选择.。从。。WHERE 和一个简单的 expr 行,它可以是一个函数,where 子句、expr 和算术。

这是语法的重要部分:

// 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将我的查询分为两个不同的部分。

我该如何解决这个问题?

谢谢编号

您的"virtual_column_statement"似乎是"select_statement"的一部分。 我希望您在两条规则之间缺少";"。

大多数"select_statement"子句都是可选的,因此在匹配 select 和 from 子句后,如果 Antlr 认为输入的平衡更好地匹配为"virtual_column_statement",那么它将采用该路径。

您的选择是:

1)让你的select_statement全面,至少和你的"virtual_column_statement"一样笼统;

2)要求在"virtual_column_statement"的开头使用关键字,以防止Antlr将其视为部分替代;

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

相关内容

  • 没有找到相关文章

最新更新