Antlr学习笔记
一、引言
什么是Antlr?引用官方的说明就是:
What is ANTLR?
ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.
从编译器的角度来看,Antlr可以用来帮助我们完成编译器前端所需要完成的一些工作:词法分析(Lexer Analysis)、语法分析(Syntax Analysis)、生成抽象语法树(Abstract Syntax Tree, AST)等等。语义分析(Semantic Analysis),例如类型检查,就需要我们自己来完成。
要使用Antlr生成语言的词法分析器(Lexer)和语法分析器(Parser),我们需要告诉Antlr语言的文法(Grammar)。Antlr采用的是上下文无关文法(Context Free Grammar),使用类似BNF的符号集来描述。使用上下文无关文法的语言比较常用的Parser有两种,LL Parser和LR Parser,而Antlr帮我们生成的是前者。
二、Antlr安装
1.命令行安装
安装好Java,在这里就不再赘述了
下载Antlr的jar包——Antlr Download
将antlr-4.7-complete.jar添加到系统环境变量的CLASSPATH中:
D:\antlr-v4.7\antlr-4.7-complete.jar;
为Antlr Tool和TestRig建立batch命令:
为了方便管理,我就在antlr-4.7-complete.jar所在文件夹下建立一个bat文件夹
在里面创建两个bat文件,一个叫antlr4.bat,内容如下:
java org.antlr.v4.Tool %*
另一个叫grun.bat,内容如下:
java org.antlr.v4.runtime.misc.TestRig %*
- 将这两个bat文件添加到系统环境变量的PATH中:
测试是否安装成功:
打开CMD
分别输入antlr4命令和grun命令,出现下图:
2.IDEA插件安装
打开IDEA,File -> Settings -> Plugins -> 导航栏搜索Antlr -> Search in repositories -> Install
这样就安装完成了,方便快捷。
三、Antlr入门
首先我们先给出一个能识别Hello World那样的简单语法:
grammar Hello; // 定义文法的名字 s : 'hello' ID; // 匹配关键字hello,后面跟着一个标志符 ID : [a-z]+; // 匹配小写字母标志符 WS : [ \t\r\n]+ -> skip; // 跳过空格、制表符、回车符和换行符
将这个语法保存为Hello.g4,然后执行以下命令来生成识别器:
antlr4 Hello.g4
Anltr会为我们在当前目录下生成6个文件:
Hello.tokens HelloLexer.java HelloParser.java HelloLexer.tokens HelloBaseListener.java HelloListener.java
执行
javac Hello*.java
将所有java文件编译。这样,我们已经有了一个可以被HelloParser和HelloLexer利用的可执行的识别器,只缺一个主程序去触发语言识别了。ANTLR运行库有提供称之为TestRig的测试工具,可以让你不创建主程序就能测试语法。TestRig使用Java反射调用编译后的识别器,它能显示关于识别器如何匹配输入的大量信息。还记得我们之前创建的grun.bat文件吗?那就是用来调用TestRig的。
现在我们来执行一下:
grun Hello s -tokens
接着输入以下内容:
hello world #输入后回车 EOF #Windows下按Ctrl+Z再按回车
TestRig会打印出记号列表,每一行输出表示一个记号以及它的有关信息:
[@0,0:4='hello',<1>,1:0] [@1,6:10='world',<2>,1:6] [@2,13:12='<EOF>',<-1>,2:0]
这里详细讲解下[@1,6:10=’world’,\<2>,1:6]