解释器构造实践-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]

参数列表:

参数 说明 -token 打印出token流 -tree 用LISP表单打印出解析书 -gui 在对话框中可视化地展示解析树 -ps file.ps 在PostScript中生成解析树的视觉表示,并将其存储在file.ps中 -encoding encodingname 如果当前语言环境无法正确读取输入,可以通过该指令指定输入文件编码 -trace 在规则输入和退出时打印规则名称和当前token -diagnostics 在解析期间打开诊断消息 -SLL 使用更快但略弱的解析策略

尝试使用GUI:

$ grun Hello r -guihello 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
原创粉丝点击