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 - */
   ;

解决方案 »

  1.   

    我也是最近才开始接触的,上面是MySQL 的SQL语法规则,从源码里的sql_yacc.yy里拿来的。
    YACC是LR文法,Antlr是用的是LL文法,需要做一个转换,消除左递归。这部分写不好,貌似Antlr无法编译。
    求编译原理没有逃课的兄弟指教!不然等看完那本龙书,我也挂了。
      

  2.   

    去国外网站,比如antlr的社区,还有stackoverflow之类试试看
      

  3.   

    呃,最近也在研究antlrantlr不支持 这种产生式
    expr : expr or expr  | expr XOR expr  | expr and expr我是用的下面的方式
    expr:mexpr (or|xor|and mexpr)*
    mexpr: ....略希望对楼主有帮助
      

  4.   

    前两天也想用antlr解析SQL语法来着,时间关系放弃了。
    借楼主宝地问一些,我主要想去掉SQL的注释 /**/,-- 和 #,不知lz还有各位知道怎么弄?
      

  5.   

    这个貌似要更复杂一些,expr生成了simple_expr,simple_expr里又回到了expr。
    搜了好久了,网上这部分信息很少,有一个老外的MySQL antlr的grammar,但他的expr写的一踏糊涂。
      

  6.   

    清理yacc的注释和action,还有格式化语法文件这部分代码我都写完了,晚些发给你吧。