开源词法&语法分析工具系列一:ANTLR4入门

一.前言

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>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值