什么是Antlr
Antlr广泛应用于编程语言解析,但并不限于程序语言,实际上只要定义好语法规则,几乎无所不能,twitter的查询串解析就使用Antlr。Antlr使用很简单,第一步:定义语法文件,*.g4; 第二步:使用Antlr工具包生成解析代码,目前支持生成java, python, c#…
当然对于解析程序语言来说,自己定义语法,那就太费劲了,实际上已经有人做好了,我们就不要重复造轮子了。各种程序语言的语法文件,在github上已经有了,详见:grammars-v4
本文主要讲Antlr-4.5.3,Antlr-v4相比v3有较大改动。
生成解析代码
从*.g4语法文件自动生成解析代码,有两种方式,一种是IDE插件,一种是命令行。以c语言语法文件C.g4为例
IDE基于IntelliJ Idea
安装Antlr v4 grammar plugin
在ide中右键C.g4,配置相关选项
触发
代码
命令行方式
将C.g4 与 antlr-4.5.3-complete.jar放于同一个文件夹java -jar antlr-4.5.3-complete.jar C.g4
使用解析代码,high起来
利用命令行(请在cmd下操作)可以进行解析验证操作,不必写代码就能玩得转
配置环境:
windows 7下,将antlr-4.5.3-complete.jar路径添加到CLASSPATH
为了操作方便,制作两个bat文件
antlr4.bat
java org.antlr.v4.Tool %*
grun.bat
java org.antlr.v4.runtime.misc.TestRig %*
准备工作
生成代码可以简单如下:
antlr4 C.g4
编译生成代码
javac *.java
测试
org.antlr.v4.runtime.misc.TestRig是antlr4 runtime内置的测试工具,它可以查看解析的tokens和AST结构。
下面以C.g4定义的”functionDefinition”规则,即函数定义规则为例
1)查看tokens,具体函数定义自行输入:
grun C functionDefinition -tokens
输入代码函数定义f:
void f(){
int a=0;
}
结果:
2)查看树形输出:
grun C functionDefinition -tree
3)AST图形化输出:
grun C functionDefinition -gui