解释器构造实践-ANTLR(一)
来源:互联网 发布:cats vs dogs数据下载 编辑:程序博客网 时间:2024/06/01 10:48
2017年9月16日
本节主要是对ANTLR进行了简要说明,介绍了环境要求与如何下载运行,最后给出了一个Hello World的例子。
参考链接附在文末,主要参考《The Definitive ANTLR 4 Reference》,如有任何问题欢迎斧正。2017年9月22日
对本节的页面进行了一些调整。
- 一 简介
- 1 ANTLR是什么
- 2 ANTLR历史
- 3 ANTLR可以用来做什么
- 二 环境要求
- 三 下载运行
- 1 下载
- 2 运行
- 3 简化
- 四 Hello World
- 1 制定语法规则
- 2 生成解析器
- 3 配置环境变量
- 4 编译
- 5 使用TestRig
- 五 参考链接
- 一 简介
一、 简介
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.jarANTLR 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/shjava -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$ lsHello.g4 HelloLexer.java HelloParser.javaHello.tokens HelloLexer.tokensHelloBaseListener.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 -tokenshello parrtEOF # 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]
参数列表:
尝试使用GUI:
$ grun Hello r -guihello 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
- 解释器构造实践-ANTLR(一)
- 解释器构造实践-ANTLR(二)
- 解释器构造实践-ANTLR(三)
- 完整cmm解释器构造实践(一):搭建环境
- CMM语言解释器构造实践(一)——前言
- ANTLR解析(一)
- CMM语言解释器构造实践(二)——JavaCC等编译工具的使用
- 完整cmm解释器构造实践(二):词法分析
- 完整cmm解释器构造实践(三):语法分析
- 完整cmm解释器构造实践(五):解释执行与GUI
- ANTLR中文手册一(致谢)
- antlr 介绍以及脚本编写(一)
- CMM语言解释器构造实践(三)——基于状态转换图的词法分析器
- 《计算机程序的构造与解释》(一)
- 解释器构造总结
- 解释器构造任务书
- 完整cmm解释器构造实践(四):语义分析与代码生成
- ANTLR教程(一)简介
- Eclipse下如何打开Servers窗口及应用
- 小游戏
- 图上的文章(割点和桥)
- 输入一个十进制数,利用栈操作,将该数转换成n进制数。
- JAVA多态——类型判断
- 解释器构造实践-ANTLR(一)
- Django框架
- WebView android sdk 25加载“file:///..."失败解决
- 统计学学习的博客转载
- 理解JVM(4)垃圾回收
- pip和easyinstall区别
- TMemoryStream、String与OleVariant互转
- 解释器构造实践-ANTLR(二)
- 输入一个表达式,表达式中包括三种括号“()”、“[]”和“{}”,判断该表达式的括号是否匹配。