解释器构造实践-ANTLR(一)

  • 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

grun


五、 参考链接

  1. 维基百科ANTLR
    https://zh.wikipedia.org/wiki/ANTLR
  2. 《ANTLR 4简明教程》
    https://github.com/dohkoos/antlr4-short-course
  3. 《The Definitive ANTLR 4 Reference》
    https://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference
  4. 《Antlr简介》
    http://blog.csdn.net/u013407592/article/details/50261203
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值