一.前言
1.为什么要研究这个工具?
最初是为了做sql审核,本来想找一款开源的sql审核软件,无奈国内某著名电商开源的一款产品居然闭源了,另外一款产品只有部分开源,核心代码也是闭源;不得已,只有自己动手丰衣足食了,刚开始研究了python的sqlparse库,但它不能保证解析的正确性,只能放弃;后来转向阿里的开源连接池druid,想利用它的sql解析功能,研究了几天,也许是文档不全的原因,也许是我java功力太浅,居然没找到DDL相关解析中可以用到我项目中的功能,其实我只要一棵完整的DDL sql的AST,最后转向了ANTLR4,目前MYSQL DDL审核部分代码和测试基本完成,Oracle尚未开始,由于大量裁员,人手不足,哎!后续,一言难尽…
二.基本概念
1.什么是词法分析&语法分析?
词法分析:把一段语句按单词分开,并标记单词的类别(比如:关键字,标识符,常数,运算符,界符…)
语法分析:把词法分析的结果按照语法标准生成AST(抽象语法树)
2.词法&语法分析有什么用处?
词法&语法分析在程序语言&自然语言&文本处理,甚至大数据分析&人工智能方面具有广泛的应用,是众多语言,工具和框架的基石;特别对于各种程序语言的编译器,意义非凡,是非常重要的编译器前端工具。
Twitter搜索就使用antlr进行语法分析,每天处理超过20亿次查询;
Hadoop生态系统中的Hive,pig,数据仓库,分析系统所使用的语言都用到了ANTLR;
Oracle在SQL开发IDE工具和迁移工具中也用到了ANTLR
Netbeans的IDE使用ANTLR来解析C++
Hibernate的ORM框架使用ANTRL来处理HQL语言
3.词法&语法分析工具有哪些?
目前开源工具主要有lex&yacc(此类工具的鼻祖c语言c++方面),antlr(java开发,更简单,更强大,特别是antlr4在lex&yacc上做了很大改进)
4.它和正则表达式有什么区别?
比正则更强大,可以完成正则难以完成的工作,譬如成对匹配问题,特别是多层嵌套情况.
三.安装配置及基本用法
1.配置安装jdk1.6以上
2.下载配置antlr-4.7.2-complete.jar放入CALSSPATH指定路径
3.配置环境变量 #说明bin放antlr4.bat和grun.bat命令;antlr4目录放语法定义文件编译后的class文件
JAVA_HOME=C:\Program Files\Java\jdk-11.0.3
CALSSPATH=.;%JAVA_HOME%\lib\antlr-4.7.2-complete.jar;D:\xlzhu\Work\Dev\java\antlr4
PATH=…%JAVA_HOME%\bin…
4.编写通用编译&测试命令,放入PATH变量指定的目录
antlr4.bat
java org.antlr.v4.Tool %*
grun.bat
java org.antlr.v4.gui.TestRig %*
5.编写Hell.g4语法定义文件
grammar Hello; #说明:Hello为语法文件名
r:‘hello’ ID; #r为语法规则名
ID:[a-z]+; #ID为词法规则名
WS:[ \t\r\n]±>skip; #WS为词法规则名
6.根据语法定义文件生成可执行程序(java)
6.1 antlr4 D:\xlzhu\Work\Dev\java\antlr4\Hello.g4 #注意带上路径,结果生成以词法分析HelloLexer.java,语法分析HelloParser.java为主的java程序
6.2 javac D:\xlzhu\Work\Dev\java\antlr4*.java
7.运行java程序,测试按特定语法编写的语句
grun Hello -r -tokens
C:\Users\xxx>java org.antlr.v4.gui.TestRig Hello -r -tokens
hello parrt
^Z
[@0,0:4=‘hello’,<‘hello’>,1:0]
[@1,6:10=‘parrt’,<ID>,1:6]
[@2,13:12=’<EOF>’,<EOF>,2:0]
No method for rule -r or it has arguments
C:\Users\xxx>