基于 ANTLR 的 Mysql 语法解析
ANTLR 是什么
ANTLR 是开源的语法解析器生成器,ANTLR 所提供的功能包如下
词法定义
定义了白名单关键词,关键词的匹配规则,类似于正则表达式
语法定义
定义了语义解析的规则,和模板类似,包含一些嵌套约束定义
基于语法和词法定义文件生成对应编程语言的词典映射文件,树形数据对象
提供可视化的调试工具
ANTLR 的使用
在 github 上我们能找到 antlr 定义的主流的一些语言的词法和语法文件定义https://github.com/antlr/grammars-v4
下载 ANTLR 的运行时依赖及对应的辅助工具 (https://www.antlr.org/download.html)
本例运行时我们选取 4.11.1 JAVA 版本
下载 antlr complete 实现可视化语法树解析及测试
也可以通过 antlr 的在线实验室进行在线的测试
对于开发环境如(intellij)可以下载 antlr 的插件

下文通过 intellij 中的插件说明使用方法
右击 lexer.g4 文件

红色生成对应语言的 parser 和 lexer 对象
黄色配置生成的路径
右击 parser.g4 文件中的根节点,指定词法分析器调出运行调试界面


ANTLR 的业务应用
解析 MYSQL 语法到业务数据对象树
ANTLR 中解析语法树的两种方式
Listener 模式
Antlr 采用数据结构和行为分离的模式,对于没有个对象节点都提供的 enter()方法和 exit()方法,我们可以在 enter()方法中和 exit()方法中自定义业务实现
Visitor 模式
Visitor 模式是可以指定节点做自定义方法处理,可控性和定制型更强一点,可以按照自己想要的遍历模式遍历整个语法树
笔者提供了将 mysql 常用的 select 查询语法解析成 SqlBuilder 的 Demo,有兴趣可以下载学习
https://github.com/javaecrainbow/code-lib/tree/master/antlr
总结
Antlr 给我们提供了完备的语法和语义定义规则,及基于这套标准的规则映射出不同编程语言的数据对象树,并且基于语法树节点提供了遍历数据的前置和后置行为方便我们做业务扩展。如果没有 Antlr,我们需要去定义一套语法标准
如:jsonSchema 其实就是定义了一套描述 json 数据的语法,在搜索领域,一些开源的分词器或者特定领域下的分词算法也是基于业务规则和语义规则定义出一套解析算法供后续业务上使用
所以 Antlr 就是一套开源的标准化的语法解析器,那我们的编程语言定义出来的一套程序要经过编写,编译到执行。在编译的阶段其实也涉及到一些词法和语法的分析, 所以 antlr 在编程语言设计上也有广泛的应用
版权声明: 本文为 InfoQ 作者【小翁牌坦克】的原创文章。
原文链接:【http://xie.infoq.cn/article/e2a69ed28ac568e124ed07869】。文章转载请联系作者。
评论