如何将MySQL yacc语法转换为antlr LL(1)?

如何将MySQL yacc语法转换为antlr LL(1)?,mysql,antlr,yacc,Mysql,Antlr,Yacc,我正在用ANTLR构造一个MySQL语法验证器。我从MySQL源代码中的sql_yacc.yy开始,但是我在转换以下语法时遇到了一些困难。我试了很多次,但都没用。有人能帮我吗 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 |

我正在用ANTLR构造一个MySQL语法验证器。我从MySQL源代码中的
sql_yacc.yy
开始,但是我在转换以下语法时遇到了一些困难。我试了很多次,但都没用。有人能帮我吗

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
  ;
ANTLR无法处理,因此没有简单的方法将
sql_yacc.yy
转换为ANTLR等价物。您可能希望从ANTLR Wiki查看以下资源:


请注意,MySQL语法不完整,但可能为您提供了一个起点。

在这种情况下,很容易看出问题所在,但下次请解释“它不工作”的实际含义(发布错误消息!)。为什么要将其作为LL(1)而不是ANTLR的全功率LL(*)?