我正在解析类似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"放在单独的解析器语法中,不要向其发送任何选择的输入文本。