Antlr4 antlr 4的听众在两个地方停下来-奇怪

Antlr4 antlr 4的听众在两个地方停下来-奇怪,antlr4,Antlr4,我正在解析一种类似SQL的语言 我想解析完整的SQL语句,比如:SELECT。。从…起WHERE和一个简单的表达式行,可以是函数、WHERE子句、表达式和算术表达式 这是语法的重要部分: // main rule parse : (statments)* EOF; // All optional statements statments : select_statement | virtual_column_statement ; select_statemen

我正在解析一种类似SQL的语言

我想解析完整的SQL语句,比如:SELECT。。从…起WHERE和一个简单的表达式行,可以是函数、WHERE子句、表达式和算术表达式

这是语法的重要部分:

// 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 ')'
;
虚拟专栏非常有用

Select查询也可以工作,但完成后,它也会转到虚拟列语句

我想让它选一个

我怎样才能解决这个问题

编辑: 经过一些研究,我发现antlr接受我的查询并将其分为两个不同的部分

我怎样才能解决这个问题

谢谢,
id

您的“虚拟列”语句似乎是“选择”语句的一部分。我想你少了一个“;”在这两条规则之间

大多数“select_语句”子句都是可选的,因此在匹配select和from子句之后,如果Antlr认为输入的余额作为“虚拟_列_语句”更匹配,那么它将采用该路径

你的选择是:

1) 让你的select_语句更全面,至少和你的“虚拟_列_语句”一样笼统

2) 在“virtual_column_statement”的开头需要一个关键字,以防止Antlr将其视为部分替代项


3) 将“virtual_column_语句”放在单独的语法分析器中,不要发送任何select输入文本。

谢谢,我添加了“;”在每个语句的末尾