《ANTLR 4权威指南》——第2章 纵 观 全 局 2.1 从ANTLR元语言开始

第2章

纵 观 全 局

在上一章中,我们安装了ANTLR,了解了如何构建和运行一个简单的示例语法。在本章中,我们将纵观全局,学习语言类应用程序相关的重要过程、术语和数据结构。随着学习的深入,我们将认识一些关键的ANTLR对象,并简单了解ANTLR在背后帮助我们完成的工作。

2.1 从ANTLR元语言开始

为了实现一门编程语言,我们需要构建一个程序,读取输入的语句,对其中的词组和输入符号进行正确的处理。语言(language)由一系列有意义的语句组成,语句(sentence)由词组组成,词组(phrase)是由更小的子词组(subphrase)和词汇符号(vocabulary symbol)组成。一般来说,如果一个程序能够分析计算或者“执行”语句,我们就称之为解释器(interpreter)。这样的例子包括计算器、读取配置文件的程序和Python解释器。如果一个程序能够将一门语言的语句转换为另外一门语言的语句,我们称之为翻译器(translator)。这样的例子包括Java到C#的转换器和普通的编译器。

为了达到预期的目的,解释器或者翻译器需要识别出一门特定语言的所有的有意义的语句、词组和子词组。识别一个词组意味着我们可以将它从众多的组成部分中辨认和区分出来。例如,我们能够将输入的“sp = 100;”识别为一个赋值语句,这意味着我们需要知道sp是被赋值的目标,100是要被赋予的值。与之类似,如果我们要识别英文语句,就需要辨认出一段对话的不同部分,例如主语、谓语和宾语。识别语句“sp = 100;”还意味着语言类应用程序能够将它和import表达式之类的语句区分开。在成功识别后,程序就能执行适当的操作,诸如performAssignment ("sp", 100)或者translateAssignment ("sp", 100)。

识别语言的程序称为语法分析器(parser)或者句法分析器(syntax analyzer)。句法(syntax)是指约束语言中的各个组成部分之间关系的规则,在本书中,我们会通过ANTLR语法来指定语言的句法。语法(grammar)是一系列规则的集合,每条规则表述出一种词汇结构。ANTLR工具能够将其转换为如同经验丰富的开发者手工构建一般的语法分析器(ANTLR是一个能够生成其他程序的程序)。ANTLR语法本身又遵循了一种专门用来描述其他语言的语法,我们称之为ANTLR元语言(ANTLR抯 meta-language)。

如果我们将语法分析的过程分解为两个相似但独立的任务或者说阶段时,实现起来就容易多了。这两个阶段与我们的大脑阅读英文文本的过程相类似。我们并不是一个字符一个字符地阅读一个句子,而是将句子看作一列单词。在识别整个句子的语法结构之前,人类的大脑首先通过潜意识将字符聚集为单词,然后获取每个单词的意义。这个过程在阅读摩斯电码的时候更加明显,因为我们需要首先将点和划转换为字符才能获取消息本身。同样的事情也发生在阅读长单词时,比如说阅读这个单词Humuhumunukunukuapua抋——它是夏威夷的州鱼。

将字符聚集为单词或者符号(词法符号,token)的过程称为词法分析(lexical analysis)或者词法符号化(tokenizing)。我们把可以将输入文本转换为词法符号的程序称为词法分析器(lexer)。词法分析器可以将相关的词法符号归类,例如INT(整数)、ID(标识符)、FLOAT(浮点数)等。当语法分析器不关心单个符号,而仅关心符号的类型时,词法分析器就需要将词汇符号归类。词法符号包含至少两部分信息:词法符号的类型(从而能够通过类型来识别词法结构)和该词法符号对应的文本。

第二个阶段是实际的语法分析过程,在这个过程中,输入的词法符号被“消费”以识别语句结构,在上例中即为赋值语句。默认情况下,ANTLR生成的语法分析器会建造一种名为语法分析树(parse tree)或者句法树(syntax tree)的数据结构,该数据结构记录了语法分析器识别出输入语句结构的过程,以及该结构的各组成部分。图2-1展示了数据在一个语言类应用程序中的基本流动过程。

语法分析树的内部节点是词组名,这些名字用于识别它们的子节点,并将子节点归类。

根节点是最抽象的一个名字,在本例中即stat(statement的简写)。语法分析树的叶子节点永远是输入的词法符号。句子,也即符号的线性组合,本质上是语法分析树在人脑中的串行化。为了能与其他人沟通,我们需要使用一串单词,使得他们能在脑海中构建出一棵相同的语法分析树。

通过语法分析树这种方便的数据结构,语法分析器就能将诸如“符号是如何构成词组的”这样的完整信息传达给程序的其余部分。树结构不仅在后续的步骤中易于处理,而且也是一种为开发者所熟知的数据结构。幸运的是,语法分析器能够自动生成语法分析树。

通过操纵语法分析树,识别同一种语言的不同程序就能复用同一个语法分析器。另外一种解决方案,也是传统的生成语法分析器的方案,是直接在语法文件中嵌入与这种程序相关的代码。ANTLR 4仍然允许这种传统的方案(详见第10章),不过,使用语法分析树可以使程序更整洁、解耦性更强。

在语言的翻译过程中,一个阶段依赖于前一个阶段的计算结果和信息,因此需要多次进行树的遍历(tree walk),这种情况下语法分析树也是非常有用的。在其他情况下,将一个复杂的程序分解为多个阶段会大大简化编码和测试工作,与其每个阶段都重新解析一下输入的字符流,不如首先生成语法分析树,然后多次访问其中的节点,这样更有效率。

由于我们使用一系列的规则指定语句的词汇结构,语法分析树的子树的根节点就对应语法规则的名字。在下文的长篇大论之前,我们先看一个例子。下面这条语法规则对应图2-1中的赋值语句子树的第一级:

使用和调试ANTLR语法的一个基本要求是,理解ANTLR是如何将这样的规则转换为人类可阅读的语法分析程序的,因此接下来我们将深入研究语法分析的过程。

时间: 2024-11-08 17:31:21

《ANTLR 4权威指南》——第2章 纵 观 全 局 2.1 从ANTLR元语言开始的相关文章

《ANTLR 4权威指南 》一第2章 纵 观 全 局

第2章 纵 观 全 局 在上一章中,我们安装了ANTLR,了解了如何构建和运行一个简单的示例语法.在本章中,我们将纵观全局,学习语言类应用程序相关的重要过程.术语和数据结构.随着学习的深入,我们将认识一些关键的ANTLR对象,并简单了解ANTLR在背后帮助我们完成的工作. 2.1 从ANTLR元语言开始 为了实现一门编程语言,我们需要构建一个程序,读取输入的语句,对其中的词组和输入符号进行正确的处理.语言(language)由一系列有意义的语句组成,语句(sentence)由词组组成,词组(ph

《ANTLR 4权威指南》——第2章纵观全局

第2章纵 观 全 局在上一章中,我们安装了ANTLR,了解了如何构建和运行一个简单的示例语法.在本章中,我们将纵观全局,学习语言类应用程序相关的重要过程.术语和数据结构.随着学习的深入,我们将认识一些关键的ANTLR对象,并简单了解ANTLR在背后帮助我们完成的工作.

《ANTLR 4权威指南》——第1章 初识ANTLR 1.1 安装ANTLR

第1章 初识ANTLR 在本书的第一部分中,我们的目标是大体上知道ANTLR能做什么.除此之外,我们还希望探究语言类应用程序的架构.在概览之后的第2章中,我们将会通过许多真实的例子来循序渐进地.系统性地学习ANTLR.在开始之前,我们需要首先安装ANTLR,然后尝试用它编写一份简单的"hello world"语法. 1.1 安装ANTLR ANTLR是用Java编写的,因此你需要首先安装Java,哪怕你的目标是使用ANTLR来生成其他语言(如C#和C++)的解析器.(我希望在不远的未来

《ANTLR 4权威指南》——第1章初识ANTLR

第1章 初识ANTLR 在本书的第一部分中,我们的目标是大体上知道ANTLR能做什么.除此之外,我们还希望探究语言类应用程序的架构.在概览之后的第2章中,我们将会通过许多真实的例子来循序渐进地.系统性地学习ANTLR.在开始之前,我们需要首先安装ANTLR,然后尝试用它编写一份简单的"hello world"语法.

《ANTLR 4权威指南 》一导读

前 言 ANTLR是一款强大的语法分析器生成工具,可用于读取.处理.执行和翻译结构化的文本或二进制文件.它被广泛应用于学术领域和工业生产实践,是众多语言.工具和框架的基石.Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询:Hadoop生态系统中的Hive.Pig.数据仓库和分析系统所使用的语言都用到了ANTLR:Lex Machina将ANTLR用于分析法律文本:Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR:NetBeans公司的IDE使用ANTLR来解

《ANTLR 4权威指南》——导读

前 言 ANTLR是一款强大的语法分析器生成工具,可用于读取.处理.执行和翻译结构化的文本或二进制文件.它被广泛应用于学术领域和工业生产实践,是众多语言.工具和框架的基石.Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询:Hadoop生态系统中的Hive.Pig.数据仓库和分析系统所使用的语言都用到了ANTLR:Lex Machina将ANTLR用于分析法律文本:Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR:NetBeans公司的IDE使用ANTLR来解

《Netty 权威指南》样章

声明:本文是<Netty 权威指南>的样章目录,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文. 第 2 章  NIO入门 在本章节,我们分别对JDK的BIO.NIO和JDK1.7最新提供的NIO2.0的使用进行详细说明,通过流程图和代码讲解,让大家体会到随着Java IO类库的不断发展和改进,基于Java的网络编程会变得越来越简单,随着异步IO功能的增强,基于Java NIO开发的网络服务器甚至不逊色于采用C++开发的网络程序. 本章主要内容包括:  传统的同步阻塞式IO编程

《ANTLR 4权威指南 》一第一部分 Part 1

第一部分 Part 1 ANTLR 1ANTLR 2 3ANTLR 4 在第一部分中,我们会安装ANTLR,尝试通过它来识别一个简单的"hello world"语法,并概览语言类应用程序的开发过程.在此基础上,我们会构造一个语法来识别和翻译形如{1,2,3}的花括号中的一列整数.最后,我们将通过一系列的简单语法和程序来快速了解ANTLR的特性. 第1章 初识ANTLR 在本书的第一部分中,我们的目标是大体上知道ANTLR能做什么.除此之外,我们还希望探究语言类应用程序的架构.在概览之后

《ANTLR 4权威指南》——1.1节安装ANTLR

1.1 安装ANTLR ANTLR是用Java编写的,因此你需要首先安装Java,哪怕你的目标是使用ANTLR来生成其他语言(如C#和C++)的解析器.(我希望在不远的未来ANTLR可以支持更多语言.)ANTLR运行所需的Java版本为1.6或更高. 为什么本书使用命令行 在整本书中,我们都会使用命令行(shell)来运行ANTLR和构建我们的程序.因为开发者使用的开发环境和操作系统五花八门,因此只有操作系统的shell才是我们公用的"界面".使用shell也使得开发语言程序的每一个步