Antlr4 antlr 4的听众在两个地方停下来-奇怪
我正在解析一种类似SQL的语言 我想解析完整的SQL语句,比如:SELECT。。从…起WHERE和一个简单的表达式行,可以是函数、WHERE子句、表达式和算术表达式 这是语法的重要部分: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
// 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输入文本。谢谢,我添加了“;”在每个语句的末尾