MySQL的yacc表达式部分文法转antlr的LL文法,这个left不好整啊!/* all possible expressions */
expr:
expr or expr
| expr XOR expr
| expr and expr
| NOT_SYM expr
| bool_pri IS TRUE_SYM
| bool_pri IS not TRUE_SYM
| bool_pri IS FALSE_SYM
| bool_pri IS not FALSE_SYM
| bool_pri IS UNKNOWN_SYM
| bool_pri IS not UNKNOWN_SYM
| bool_pri
;bool_pri:
bool_pri IS NULL_SYM
| bool_pri IS not NULL_SYM
| bool_pri EQUAL_SYM predicate
| bool_pri comp_op predicate
| bool_pri comp_op all_or_any '(' subselect ')'
| predicate
;predicate:
bit_expr IN_SYM '(' subselect ')'
| bit_expr not IN_SYM '(' subselect ')'
| bit_expr IN_SYM '(' expr ')'
| bit_expr IN_SYM '(' expr ',' expr_list ')'
| bit_expr not IN_SYM '(' expr ')'
| bit_expr not IN_SYM '(' expr ',' expr_list ')'
| bit_expr BETWEEN_SYM bit_expr AND_SYM predicate
| bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate
| bit_expr SOUNDS_SYM LIKE bit_expr
| bit_expr LIKE simple_expr opt_escape
| bit_expr not LIKE simple_expr opt_escape
| bit_expr REGEXP bit_expr
| bit_expr not REGEXP bit_expr
| bit_expr
;bit_expr:
bit_expr '|' bit_expr
| bit_expr '&' bit_expr
| bit_expr SHIFT_LEFT bit_expr
| bit_expr SHIFT_RIGHT bit_expr
| bit_expr '+' bit_expr
| bit_expr '-' bit_expr
| bit_expr '+' INTERVAL_SYM expr interval
| bit_expr '-' INTERVAL_SYM expr interval
| bit_expr '*' bit_expr
| bit_expr '/' bit_expr
| bit_expr '%' bit_expr
| bit_expr DIV_SYM bit_expr
| bit_expr MOD_SYM bit_expr
| bit_expr '^' bit_expr
| simple_expr
;
simple_expr:
simple_ident
| function_call_keyword
| function_call_nonkeyword
| function_call_generic
| function_call_conflict
| simple_expr COLLATE_SYM ident_or_text
| literal
| param_er
| variable
| sum_expr
| simple_expr OR_OR_SYM simple_expr
| '+' simple_expr
| '-' simple_expr
| '~' simple_expr
| not2 simple_expr
| '(' subselect ')'
| '(' expr ')'
| '(' expr ',' expr_list ')'
| ROW_SYM '(' expr ',' expr_list ')'
| EXISTS '(' subselect ')'
| ''
| MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')'
| BINARY simple_expr
| CAST_SYM '(' expr AS cast_type ')'
| CASE_SYM opt_expr when_list opt_else END
| CONVERT_SYM '(' expr ',' cast_type ')'
| CONVERT_SYM '(' expr USING charset_name ')'
| DEFAULT '(' simple_ident ')'
| VALUES '(' simple_ident_nospvar ')'
| INTERVAL_SYM expr interval '+' expr
/* we cannot put interval before - */
;
expr:
expr or expr
| expr XOR expr
| expr and expr
| NOT_SYM expr
| bool_pri IS TRUE_SYM
| bool_pri IS not TRUE_SYM
| bool_pri IS FALSE_SYM
| bool_pri IS not FALSE_SYM
| bool_pri IS UNKNOWN_SYM
| bool_pri IS not UNKNOWN_SYM
| bool_pri
;bool_pri:
bool_pri IS NULL_SYM
| bool_pri IS not NULL_SYM
| bool_pri EQUAL_SYM predicate
| bool_pri comp_op predicate
| bool_pri comp_op all_or_any '(' subselect ')'
| predicate
;predicate:
bit_expr IN_SYM '(' subselect ')'
| bit_expr not IN_SYM '(' subselect ')'
| bit_expr IN_SYM '(' expr ')'
| bit_expr IN_SYM '(' expr ',' expr_list ')'
| bit_expr not IN_SYM '(' expr ')'
| bit_expr not IN_SYM '(' expr ',' expr_list ')'
| bit_expr BETWEEN_SYM bit_expr AND_SYM predicate
| bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate
| bit_expr SOUNDS_SYM LIKE bit_expr
| bit_expr LIKE simple_expr opt_escape
| bit_expr not LIKE simple_expr opt_escape
| bit_expr REGEXP bit_expr
| bit_expr not REGEXP bit_expr
| bit_expr
;bit_expr:
bit_expr '|' bit_expr
| bit_expr '&' bit_expr
| bit_expr SHIFT_LEFT bit_expr
| bit_expr SHIFT_RIGHT bit_expr
| bit_expr '+' bit_expr
| bit_expr '-' bit_expr
| bit_expr '+' INTERVAL_SYM expr interval
| bit_expr '-' INTERVAL_SYM expr interval
| bit_expr '*' bit_expr
| bit_expr '/' bit_expr
| bit_expr '%' bit_expr
| bit_expr DIV_SYM bit_expr
| bit_expr MOD_SYM bit_expr
| bit_expr '^' bit_expr
| simple_expr
;
simple_expr:
simple_ident
| function_call_keyword
| function_call_nonkeyword
| function_call_generic
| function_call_conflict
| simple_expr COLLATE_SYM ident_or_text
| literal
| param_er
| variable
| sum_expr
| simple_expr OR_OR_SYM simple_expr
| '+' simple_expr
| '-' simple_expr
| '~' simple_expr
| not2 simple_expr
| '(' subselect ')'
| '(' expr ')'
| '(' expr ',' expr_list ')'
| ROW_SYM '(' expr ',' expr_list ')'
| EXISTS '(' subselect ')'
| ''
| MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')'
| BINARY simple_expr
| CAST_SYM '(' expr AS cast_type ')'
| CASE_SYM opt_expr when_list opt_else END
| CONVERT_SYM '(' expr ',' cast_type ')'
| CONVERT_SYM '(' expr USING charset_name ')'
| DEFAULT '(' simple_ident ')'
| VALUES '(' simple_ident_nospvar ')'
| INTERVAL_SYM expr interval '+' expr
/* we cannot put interval before - */
;
YACC是LR文法,Antlr是用的是LL文法,需要做一个转换,消除左递归。这部分写不好,貌似Antlr无法编译。
求编译原理没有逃课的兄弟指教!不然等看完那本龙书,我也挂了。
expr : expr or expr | expr XOR expr | expr and expr我是用的下面的方式
expr:mexpr (or|xor|and mexpr)*
mexpr: ....略希望对楼主有帮助
借楼主宝地问一些,我主要想去掉SQL的注释 /**/,-- 和 #,不知lz还有各位知道怎么弄?
搜了好久了,网上这部分信息很少,有一个老外的MySQL antlr的grammar,但他的expr写的一踏糊涂。