MySQLParser
这是解析SQL命令库。当前支持的唯一命令是DDL语句,特别是CREATE TABLE,ALTER TABLE,DROP VIEW和DROP TABLE。
安装
在命令行:
> gem install mysql-parser.x.x.x.gem
用法
In ruby:
> require 'mysql-parser'
> MySQLParser.new.parse "ALTER TABLE `table` DROP INDEX abc, DROP INDEX def"
=> {:tree=><root: [<S: [" "]>, <r_commands: [<r_ALTER_TABLE: ["ALTER", <S: [" "]>, <r_ONLINE_OFFLINE: []>, <r_opt_IGNORE: []>, "TABLE", <S: [" "]>, <r_tbl_name: [<r_tbl_name_int: [<ident: ["`", <opt_ident_in_backtick: [<opt_ident_in_backtick: []>, "table"]>, "`", <S: [" "]>]>]>]>, <r_opt_alter_commands: [<r_comma_separated_alter_specification: [<r_comma_separated_alter_specification: [<r_alter_specification: ["DROP", <S: [" "]>, <r_INDEX_or_KEY: ["INDEX", <S: [" "]>]>, <r_index_name: [<ident: [<raw_ident: ["abc", <S: [" "]>]>]>]>]>]>, <comma: [",", <S: [" "]>]>, <r_alter_specification: ["DROP", <S: [" "]>, <r_INDEX_or_KEY: ["INDEX", <S: [" "]>]>, <r_index_name: [<ident: [<raw_ident: ["def", <S: [" "]>]>]>]>]>]>]>, <r_opt_after_alter: []>, <r_opt_PARTITION_options: []>]>]>]>, :state=>{}}
mysql.rex.rb
这个文件是一个词法分析器。它确定DROP
是一个命令,而“ABCDEF”
是一个字符串。本文件主要是自动生成的由斌/生成字面
其内容mysql.y.rb
并自动生成所需的文字。因此,这个文件通常不需要进行编辑。理由如下可能的理由编辑:
- 创建同义词
- 创建一个长的文字[1]
- 创建不在解析器已经存在一个文字
[1]一个长文字是这是需要一个特殊的目的,例如文字,因为它由空格并且需要被分配给它的同义词。通常情况下,但是,我们不需要他们。
惯例
-
S_...
means some symbol -
A_...
means some state -
L_...
means long literal - Everything else is literal
mysql.y.rb
这是该库的主要文件。它包含了所有的语法和相关联的动作。
语法
原来MySQL的语法可以发现 https://github.com/twitter/mysql/blob/master/sql/sql_yacc.yy。文档下可以找到https://dev.mysql.com/doc/refman/5.6/en/
冲突
sql_yacc.yy
是不完美的。它包含了很多冲突。当翻译成mysql.y.rb
,请解决这些冲突,这样的规则可以预见的。
调试
调试mysql.y.rb
可以通过设置来完成@yydebug
到真正
的 初始化
。
字面
一个新的文字介绍可以通过只完成使用它。斌/生成-literal.rb
将读取mysql.y.rb
并确保新的文字创建。同样,删除任何文字可以通过只做到不使用它。
惯例
以下是一般的惯例。
-
空间是
小号
-
选择_...
意味着该规则是可选的。第一个分支应该是空的。 -
{逗号,空格} _separated _...
指由一个分离器分离项的集合(逗号或空格)
斌/生成,literal.rb
该脚本扫描mysql.y.rb
(或实际上,parser.output
这是从产生mysql.y.rb
),并补充说,不存在新的文本,并删除未使用的文字。
斌/亚军
这是一个REPL。只需输入任何发送档案结尾字符(CTRL-D
),以让脚本流程的输入。要退出,只是终止使用CTRL-C
。
> DROP TABLE
table
^D
parse error on value "table" (TABLE)
>
斌/ sanity_check
该脚本可以确保没有跳过的动作,所有动作名称是正确的。
发展
改变后mysql.rex.rb
或mysql.y.rb
,运行耙生成
,生成真正的词法和语法分析器。运行耙规范
运行所有测试案例
下载地址https://github.com/square/mysql-parser/archive/master.zip