Anrlr4 生成C++版本的语法解析器
目录
正文
一、 写在前面
我最早是在2005年,首次在实际开发中实现语法解析器,当时调研了Yacc&Lex,觉得风格不是太好,关键当时yacc对多线程也支持的不太好,接着就又学习了Bison&Flex,那时Bison的版本还是v1.x.y,对C++的支持比较差,最终选择了Biso++ & Flex++,两者支持C++版本并且跨平台支持Linux和windows。业务需求是实现全文检索Contains表达式的解析,包括调研、学习、实现和测试,大致用了2月,很多时间花费在解决语法冲突、内存管理等方面。
后来换了工作单位,在2012年再次需要实现Contains表达式语法,这时的Bison和Flex都稳定支持C++版本了,所以就直接采用Bison&Flex,大约用了不到2周,实现了Contains表达式解析和单元测试。
最近一次是在2018年,需要用Java版本的Contains表达式解析,这次采用的是Antlr4,开发和测试仅用了一个周六日在家的业余时间。感觉Antlr4明显比Bison&Flex简单,对语法规则的支持很直观易懂,用在语法冲突比较少的业务环境中非常合适,更关键的是:相对于Bison,Antlr4产生的Parser可以顺手生成对应规则的嵌套类,如果象我一样喜欢Visitor风格的话,完全可以做到语法文件与代码文件分离,从而大大缩短语法解析器的开发周期,并大大降低维护难度。
但是Antlr4最大的问题是对低版本C++的支持不太好,它需要高版本的GCC,在Centos7中的GCC为4.8.5无法编译通过,好在Centos8刚刚发布,它的GCC为8.2.1,正好来试验Antlr4的C++版本来实现Contains表达式语法。
网上的Antlr4生成C++版本语法解析器的资料较少,本文侧重整理与之相关的内容,并以Contains语法表达式为例,而具体的Antlr4的学习材料请见文尾的参考材料。
二、 搭建开发环境
1)、首先是安装Centos8的虚拟机环境,如上文所述,其gcc版本为8.2.1。
2)、Antlr4需要使用jdk,在Centos8中包含了jdk1.8和jdk11,我们选择安装jdk1.8
suyum install java-1.8.0-openjdk
安装完成后查看版本
java -version openjdk version "1.8.0_201" OpenJDK Runtime Environment (build 1.8.0_201-b09) OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
3)、下载Antlr4的Java包,用于根据语法文件生成C++版的解析器。
在antlr的下载页https://www.antlr.org/download.html中找到Complete ANTLR 4.7.2 Java binaries jar. Complete ANTLR 4.7.2 tool, Java runtime and ST 4.0.8, which lets you run the tool and the generated code.,注:随着时间的变化antlr4版本和下载链接都会变化呀。
mkdir libs curl https://www.antlr.org/download/antlr-4.7.2-complete.jar -o ./libs/antlr-4.7.2-complete.jar
验证
java -jar ./libs/antlr-4.7.2-complete.jar ANTLR Parser Generator Version 4.7.2 -o ___ specify output directory where all output is generated -lib ___ specify location of grammars, tokens files -atn generate rule augmented transition network diagrams -encoding ___ specify grammar file