Antlr简介
ANTLR(Another Tool for Language Recognition),一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。它被广泛的用于构建语言,工具,和框架。
ANTLR 现在已经支 持了多种当前流行的开发语言,包括 Java、C#、C、C++、Objective-C、Python 和 Ruby.1 等。
现实的项目中,我们可以使用 ANTLR ,来解析一些正则表达式无法完成的复杂语法解析,你也可以用它生成自己的SQL语法,甚至是一门新的编程语言。
基本概念
为了实现一门编程语言,我们需要构建一个程序,读取输入的语句,对其中的词组和输入符号进行正确的处理。一般来说,如果一个程序能够分析识别语句我们称之为语法分析器(parser)。例如一段代码”sp = 100;”,我们的语法分析器能将其识别为一个赋值语句,sp是被赋值的目标,100是要被赋予的值。
语法分析的过程其实可以分解为两个相似但独立的任务或者说阶段。
第一个阶段是词法分析(lexical analysis),将字符聚集为单词或者符号(词法符号,token)的过程。
这和我们的大脑阅读英文文本的过程相类似,我们并不是一个字符一个字符地阅读一个句子,而是将句子看作一列单词,先通过潜意识将字符聚集为单词,然后获取每个单词的意义。
第二个阶段是实际的语法分析过程,在这个过程中,输入的词法符号被”消费”以识别语句结构,在上例中即为赋值语句。默认情况下,ANTLR生成的语法分析器会建造一种名为语法分析树(parse tree)。下图展示了流动过程。
Antlr安装
接下来介绍下antlr4+eclipse环境搭建。你可以在eclipse market下载插件。
Antlr入门
用 ANTLR 开发一个语法分析器大致分三步,第一步:写出要分析内容的 文法。第二步:用 ANTLR 生成相对该文法的语法分析器的代码。第三步:编译运行语法分 析器。 接下来我们举一个简单的例子:
1. 新建项目:
新建完毕的项目目录如下:
2. 在Hello.g4文件中填写如下内容:
我们逐条分析一下这个文件里面代码的含义:
grammar Hello; // 声明一个叫做Hello的语法,下面所有的语法和词法规则都属于Hello。
r : ‘hello’ ID ; // 说明 r 是一个 ‘hello’开头,后接 ID 的字符串。
ID : [a-z]+ ; // ID 为任意小写字母的组合。
WS : [ trn]+ -> skip ; // 告诉系统跳过 ‘t’ ‘r’ ‘n’。
3. 右键运行,之后可以在我们的项目底下发现如下代码:
4. 使用语法解析器
当用户输入”hello jack”时,我们如何利用上述的代码来分析出来是”jack”。这边新建一个java工程,我们运行下anltr生成的代码,在这之前你需要依赖依稀antlr的包:
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4</artifactId>
<version>4.5.2</version>
</dependency>
定义一个visitor(后续会讲,此处我们用来获取一些信息):
定义Main函数:
//读取输入文本
ANTLRInputStream inputStream = new ANTLRInputStream(“hello jack”);
//词法分析
HelloLexer lexer = new HelloLexer(inputStream);
//词法符号
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
//语法解析
HelloParser parser = new HelloParser(tokenStream);
// 语法解析树
ParseTree parseTree = parser.r();
//以文本的形式答应树形结构
System.out.println(“tree1:”+parseTree.toStringTree(parser));
//访问visitor
MyHelloVisitor vistor = new MyHelloVisitor();
vistor.visit(parseTree);
输出:
后续内容播报
后续我们将介绍更多关于Antlr的支持。
Antlr元语言
Antlr遍历机制
Antlr错误机制
Antlr代码嵌入、属性和动作
Antlr 竞品分析
来源:IT那些年那些事
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!