1. ANTLR简介
antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。(摘自百度百科)
即简单来说,使用ANTLR,我们可以不再需要手动编写大段的字符串处理代码即可完成构建词法解析器、语法解析器以及语义解析器的任务,因为我们可以只编写某个语言对应的文法规则,而生成对应代码的任务就可以直接交给ANTLR这个工具进行处理了。这样可以大大缩短我们编写编译器或解释器的时间,进而我们可以将主要的精力放置在文法规则的编写和语法树信息的提取上了。
2. 学习动机
在许多工作的情况下可能会涉及到对一些特定格式代码的语义处理,例如ccf csp测试中的类似手写markdown代码简单的解析器,手写json解析器,甚至判断化学方程式是否配平等等,其实现实中有非常多的情况需要我们定制对应的解析器对这些代码进行处理,因此这段时间里我就在提前学习一些编译原理的相关知识。浏览了许多知乎中的问答之后发现有答主推荐《编程语言实现模式》这本书,我在学习这本书的过程中确实大开眼界,解决了许多之前我感到迷惑的问题。此书介绍了许多手写解析器的原理,并说明了手写解析器实际上是非常繁琐而意义不大的事情,在学会原理之后就应该尽量使用例如antlr,Lex,Yacc等词法分析工具来代替手工完成这些繁琐的任务,因此我就开始了antlr的学习之旅。
二、环境配置和使用示例这里学习antlr参考的书籍为:《ANTLR4 权威指南》
1. 下载antlr对应jar包
因为我是直接跟着上述这本书进行学习的,因此我使用的版本为antlr 4.0,下载url:
http://www.antlr.org/download/antlr-4.0-complete.jar
下载好的jar包放置到一个专门的路径(文件夹)下,例如:
2. 设置CLASSPATH和Path环境变量
2.1 CLASSPATH环境变量
首先我们需要Java虚拟机在运行时加载对应的类,因此需要先设置CLASSPATH环境变量,即在这个环境变量的最后添加上antlr jar包的路径,例如:
测试配置是否完成,输入:
java org.antlr.v4.Tool
效果:
2.2 Path环境变量
当我们要使用antlr时,都需要输入那么多的命令,就显得很繁琐,因此我们需要使用bat(批处理脚本)来简化我们的输入,创建antlr4.bat文件,然后输入如下内容:
java org.antlr.v4.Tool %*
然后将这个目录添加到Path环境变量(即antlr4.bat所在的目录):
测试配置是否完成,输入antlr4
:
此外我们还需要添加一个测试组件的命令,和antlr4一样,我们需要先新建一个grun.bat的文件,然后输入以下内容:
@ECHO OFF
SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
@ECHO ON
java org.antlr.v4.runtime.misc.TestRig %*
测试配置,输入grun
:
这样基本的配置就完成了。
3. 简单使用示例
首先新建一个Hello.g4文件,内容如下:
grammar Hello;
r: 'hello' ID;
ID: [a-z]+;
WS: [ \t\r\n]+ -> skip;
然后执行:
antlr4 Hello.g4
然后会发现得到了许多java文件和.tokens文件:
我们在使用javac
命令来将这些java文件编译成字节码文件:
javac *.java
最后再使用指令grun
来测试我们的文法:
❯ grun Hello r -tokens
hello world
^Z
运行结果:
此外我们还可以切换最终的展示模式,例如使用-gui
:
❯ grun Hello r -gui
hello world
^Z
运行结果:
三、IDEA中ANTLR插件的使用首先在IDEA中下载ANTLR v4
插件:
对一条写好的规则点击右键,例如:
然后即可在下面的测试框中输入对应的文本进行测试了(直接提供可视化语法树):
此外我们还可以在用户界面设置生成java文件的选项并生成对应的java文件(右键g4文件):
设置生成选项:
生成的java文件: