我正在解析类似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
答案 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'在单独的解析器语法中,不要将任何选择输入文本发送给它。