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

第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展示了数据在一个语言类应用程序中的基本流动过程。

图2-1 某数据在语言类程序中的流动过程
语法分析树的内部节点是词组名,这些名字用于识别它们的子节点,并将子节点归类。
根节点是最抽象的一个名字,在本例中即stat(statement的简写)。语法分析树的叶子节点永远是输入的词法符号。句子,也即符号的线性组合,本质上是语法分析树在人脑中的串行化。为了能与其他人沟通,我们需要使用一串单词,使得他们能在脑海中构建出一棵相同的语法分析树。
通过语法分析树这种方便的数据结构,语法分析器就能将诸如“符号是如何构成词组的”这样的完整信息传达给程序的其余部分。树结构不仅在后续的步骤中易于处理,而且也是一种为开发者所熟知的数据结构。幸运的是,语法分析器能够自动生成语法分析树。
通过操纵语法分析树,识别同一种语言的不同程序就能复用同一个语法分析器。另外一种解决方案,也是传统的生成语法分析器的方案,是直接在语法文件中嵌入与这种程序相关的代码。ANTLR 4仍然允许这种传统的方案(详见第10章),不过,使用语法分析树可以使程序更整洁、解耦性更强。
在语言的翻译过程中,一个阶段依赖于前一个阶段的计算结果和信息,因此需要多次进行树的遍历(tree walk),这种情况下语法分析树也是非常有用的。在其他情况下,将一个复杂的程序分解为多个阶段会大大简化编码和测试工作,与其每个阶段都重新解析一下输入的字符流,不如首先生成语法分析树,然后多次访问其中的节点,这样更有效率。
由于我们使用一系列的规则指定语句的词汇结构,语法分析树的子树的根节点就对应语法规则的名字。在下文的长篇大论之前,我们先看一个例子。下面这条语法规则对应图2-1中的赋值语句子树的第一级:

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

时间: 2024-10-06 19:57:05

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

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

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

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

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

《ANTLR 4权威指南》——第3章 入门的ANTLR项目 3.1 ANTLR工具、运行库以及自动生成的代码

第3章 入门的ANTLR项目 作为我们的第一个ANTLR项目,我们会构造一个语法,它是C语言或其继承者Java语法的一个很小的子集.具体来说,我们将识别包裹在花括号或者嵌套的花括号中的一些整数,像是{1, 2, 3}和{1, {2, 3}, 4}这样.这样的结构可以作为int数组或者C语言中的结构体的初始化语句.在很多情况下,针对这种语法的语法分析器都非常有用.例如,我们可以用它来构建一个对C语言的源代码进行重构的工具,这个工具能够完成这样的工作:如果初始化语句中所有的整数值都能用一个字节表示,

《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来解

《ELK Stack权威指南 》第2章 插件配置

本节书摘来自华章出版社<ELK Stack权威指南 >一书中的第1章,第2节,作者饶琛琳,更多章节内容可以访问"华章计算机"公众号查看. 插 件 配 置 插件是Logstash最大的特色.各种不同的插件源源不断地被创造出来,发布到社区中供大家使用.本章会按照插件的类别,对一般场景下的一些常用插件做详细的配置和用例介绍.本章介绍的插件包括:1)输入插件.基于shipper端场景,主要介绍STDIN.TCP.File等插件.2)编解码插件.编解码通常是会被遗忘的环节,但是运用好

《ELK Stack权威指南 》第3章 场景示例

本节书摘来自华章出版社<ELK Stack权威指南 >一书中的第1章,第3节,作者饶琛琳,更多章节内容可以访问"华章计算机"公众号查看. 场 景 示 例 前面虽然介绍了几十个Logstash插件的常见配置项,但是过多的选择下,如何组合使用这些插件,依然是一部分用户的难题.本章将列举一些最常见的日志场景,演示针对性的组件搭配,希望能给读者带来启发. 本章介绍的场景包括:Nginx访问日志.Nginx错误日志.Postfix日志.Ossec日志.Windows系统日志.Java

《Windows 8 权威指南》——第1章 Windows 8已经到来的盛宴 1.1 Windows商店

第1章 Windows 8已经到来的盛宴 windows 8 是微软公司于 2012 年即将正式发布的新一代具有革命性变化的客户端操作系统.Windows 8设计的目标在于让人们的日常电脑操作更加简单和快捷,为人们提供高效易行的工作环境.它将支持来自Intel.AMD 和 ARM 的芯片架构.这一改变意味着Windows系统开始向更多平台迈进,包括平板电脑和PC.Windows Phone 8也将采用和Windows 8相同的内核. 2011年9月14日,Windows 8开发者预览版发布,宣布