2017年9月16日
本节主要是对ANTLR进行了简要说明,介绍了环境要求与如何下载运行,最后给出了一个Hello World的例子。
参考链接附在文末,主要参考《The Definitive ANTLR 4 Reference》,如有任何问题欢迎斧正。2017年9月22日
对本节的页面进行了一些调整。
一、 简介
1.1 ANTLR是什么
ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Java语言编写,使用自上而下(top-down)的递归下降LL剖析器方法。
1.2 ANTLR历史
ANTLR最初叫做PCCTS(Purdue Compiler Construction Tool Set),是Terence Parr在普渡大学攻读硕士学位时的创作,在Hank Dietz教授的指导下,开始研究构造自动化的分析器。1993年,Parr取得博士学位,并于同年发布ANTLR 1.10版。最早的ANTLR只支持Java, 直到ANTLR 3以后开始支持Ada95、C、C#、JavaScript、Objective-C、Perl、Python、Ruby、C++和Standard ML。
1.3 ANTLR可以用来做什么
编程语言处理
识别和处理编程语言是 Antlr 的首要任务,编程语言的处理是一项繁重复杂的任务,为了简化处理,一般的编译技术都将语言处理工作分为前端和后端两个部分。其中前端包括词法分析、语法分析、语义分析、中间代码生成等若干步骤,后端包括目标代码生成和代码优化等步骤。
Antlr 致力于解决编译前端的所有工作。使用 Anltr 的语法可以定义目标语言的词法记号和语法规则,Antlr 自动生成目标语言的词法分析器和语法分析器;此外,如果在语法规则中指定抽象语法树的规则,在生成语法分析器的同时,Antlr 还能够生成抽象语法树;最终使用树分析器遍历抽象语法树,完成语义分析和中间代码生成。整个工作在 Anltr 强大的支持下,将变得非常轻松和愉快。
文本处理
当需要文本处理时,首先想到的是正则表达式,使用 Anltr 的词法分析器生成器,可以很容易的完成正则表达式能够完成的所有工作;除此之外使用 Anltr 还可以完成一些正则表达式难以完成的工作,比如识别左括号和右括号的成对匹配等。
二、 环境要求
由于ANTLR是由Java写成,所以在安装ANTLR前必须配置好Java环境。要求Java 1.6或以上的环境。
注:笔者采用的是macOS 10.12.6,JDK1.8。
三、 下载运行
3.1 下载
$ cd /usr/local/lib
$ curl -O http://www.antlr.org/download/antlr-4.5.3-complete.jar
3.2 运行
$ java -jar /usr/local/lib/antlr-4.5.3-complete.jar
ANTLR Parser Generator Version 4.5.3
...
显示版本号则说明ANTLR工具正常
3.3 简化
显然运行的这条指令太长。就像快捷键一样,我们需要用一个简便的方式来代替该指令。
1. 别名(alias)
# 一次性别名
$ alias antlr4='java -jar /usr/local/lib/antlr-4.5.3-complete.jar'
# 永久性别名
# 使用vi或者其他工具将 alias antlr4='java -jar /usr/local/lib/antlr-4.5.3-complete.jar'添加到~/.bash_profile 中,具体操作略
$ source ~/.bash_profile
2. 脚本(shell script)
$ cd /usr/local/bin
$ sudo touch antlr4
然后用vi或者其他工具将以下内容写入antlr4,注意可能需要使用chmod
指令为该文件脚本设置权限:
#!/bin/sh
java -cp "/usr/local/lib/antlr-4.5.3-complete.jar:$CLASSPATH" org.antlr.v4.Tool $*
同样在终端中输入antlr4以检验是否成功antlr是否正常运行。
四、 Hello World
4.1 制定语法规则
创建一个名为Hello.g4的文件,输入以下内容:
grammar Hello; // 定义一个名为Hello的语法,该名称与文件名相同
r : 'hello' ID; // 匹配关键词hello后面的标志符
ID : [a-z]+; // 匹配由所有小写字母组成的标志符
WS: [ \t\r\n]+ -> skip; // 跳过空格符、制表符、换行符
4.2 生成解析器
$ antlr4 Hello.g4
$ ls
Hello.g4 HelloLexer.java HelloParser.java
Hello.tokens HelloLexer.tokens
HelloBaseListener.java HelloListener.java
4.3 配置环境变量
# 一次性环境变量配置
$ export CLASSPATH=".:/usr/local/lib/antlr-4.5.3-complete.jar:$CLASSPATH"
# 永久性环境变量配置
# 使用vi或者其他工具将 export CLASSPATH=".:/usr/local/lib/antlr-4.5.3-complete.jar:$CLASSPATH"添加到~/.bash_profile 中,具体操作略
$ source ~/.bash_profile
4.4 编译
$ javac *.java
4.5 使用TestRig
ANTLR在运行时库里提供灵活的测试工具称为TestRig。它可以显示大量信息,例如如何从文件或标准输入中识别匹配输入。同样的我们为其配置一个别名来使用它。
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'
$ grun Hello r -tokens
hello parrt
EOF # mac或者unix下使用control+D,win下使用ctrl+Z
[@0,0:4='hello',<1>,1:0]
[@1,6:10='parrt',<2>,1:6]
[@2,12:11='<EOF>',<-1>,2:0]
参数列表:
参数 | 说明 |
---|---|
-token | 打印出token流 |
-tree | 用LISP表单打印出解析书 |
-gui | 在对话框中可视化地展示解析树 |
-ps file.ps | 在PostScript中生成解析树的视觉表示,并将其存储在file.ps中 |
-encoding encodingname | 如果当前语言环境无法正确读取输入,可以通过该指令指定输入文件编码 |
-trace | 在规则输入和退出时打印规则名称和当前token |
-diagnostics | 在解析期间打开诊断消息 |
-SLL | 使用更快但略弱的解析策略 |
尝试使用GUI:
$ grun Hello r -gui
hello parrt
五、 参考链接
- 维基百科ANTLR
https://zh.wikipedia.org/wiki/ANTLR - 《ANTLR 4简明教程》
https://github.com/dohkoos/antlr4-short-course - 《The Definitive ANTLR 4 Reference》
https://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference - 《Antlr简介》
http://blog.csdn.net/u013407592/article/details/50261203