Antlr4 入门 –程序员不只是增删改查那么简单!

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)。下图展示了流动过程。

Antlr4 入门 --程序员不只是增删改查那么简单!

Antlr安装

接下来介绍下antlr4+eclipse环境搭建你可以在eclipse market下载插件。

Antlr4 入门 --程序员不只是增删改查那么简单!

Antlr4 入门 --程序员不只是增删改查那么简单!

Antlr入门

用 ANTLR 开发一个语法分析器大致分三步,第一步:写出要分析内容的 文法。第二步:用 ANTLR 生成相对该文法的语法分析器的代码。第三步:编译运行语法分 析器。 接下来我们举一个简单的例子:

1. 新建项目:

Antlr4 入门 --程序员不只是增删改查那么简单!

新建完毕的项目目录如下:

Antlr4 入门 --程序员不只是增删改查那么简单!

2. 在Hello.g4文件中填写如下内容:

Antlr4 入门 --程序员不只是增删改查那么简单!

我们逐条分析一下这个文件里面代码的含义:

grammar Hello; // 声明一个叫做Hello的语法,下面所有的语法和词法规则都属于Hello。

r : ‘hello’ ID ; // 说明 r 是一个 ‘hello’开头,后接 ID 的字符串。

ID : [a-z]+ ; // ID 为任意小写字母的组合。

WS : [ trn]+ -> skip ; // 告诉系统跳过 ‘t’ ‘r’ ‘n’。

3. 右键运行,之后可以在我们的项目底下发现如下代码:

Antlr4 入门 --程序员不只是增删改查那么简单!

4. 使用语法解析器

当用户输入”hello jack”时,我们如何利用上述的代码来分析出来是”jack”。这边新建一个java工程,我们运行下anltr生成的代码,在这之前你需要依赖依稀antlr的包:

<dependency>

<groupId>org.antlr</groupId>

<artifactId>antlr4</artifactId>

<version>4.5.2</version>

</dependency>

定义一个visitor(后续会讲,此处我们用来获取一些信息):

Antlr4 入门 --程序员不只是增删改查那么简单!

定义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);

输出:

Antlr4 入门 --程序员不只是增删改查那么简单!

后续内容播报

后续我们将介绍更多关于Antlr的支持。

  • Antlr元语言

  • Antlr遍历机制

  • Antlr错误机制

  • Antlr代码嵌入、属性和动作

  • Antlr 竞品分析

  • Antlr4 入门 --程序员不只是增删改查那么简单!

    来源:IT那些年那些事

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2017年11月1日
    下一篇 2017年11月1日

    相关推荐