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

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

本文介绍了如何将 MySQL yacc 语法转换为 antlr LL(1)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用 ANTLR 构建一个 MySQL 语法验证器.我从 MySQL 源代码中的 sql_yacc.yy 开始,但我在转换以下语法时遇到了一些困难.我尝试了很多次,但它不起作用.有人可以帮我吗?

I am constructing a MySQL grammar validator with ANTLR. I started with the sql_yacc.yy from the MySQL source code, but I have some difficulties converting the following grammar. I tried many times, but it doesn't work. Can anyone help me?

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 无法应对 left-recursion,因此没有简单的方法可以将 sql_yacc.yy 转换为 ANTLR 等效项.您可能想查看 ANTLR Wiki 中的以下资源:

ANTLR cannot cope with left-recursion, so there's no trivial way to convert sql_yacc.yy into the ANTLR equivalent. You might want to have a look at the following resources from the ANTLR Wiki:

  • 左递归移除
  • MySQL 方言 (ANTLR v3) 的 SQL 语法

请注意,MySQL 语法不完整,但可能会给您一个起点.

Note that the MySQL grammar is incomplete, but might give you a starting point.

这篇关于如何将 MySQL yacc 语法转换为 antlr LL(1)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:如何将 MySQL yacc 语法转换为 antlr LL(1)?

基础教程推荐