- 1、本文档共39页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 简单的一遍编译器
这一章是本书第3章到第8章的内容简介。本章通过开发一个把中缀表达式转换成后缀表达式的C程序来展示一些基本编译技术。本章重点描述编译器的前端部分,即词法分析、语法分析和中间代码生成。第9章和第10章讲述代码生成和代码优化。
概述
程序设计语言可以通过描述以下两个方面来定义:第一方面是程序模式,即语言的语法; 第二方面是程序含义,即语言的语义。为了说明语言的语法,我们介绍一种广为使用的表示法: 上下文无关文法或者 BNF(Backus-Naur 范式)。使用现有的表示法描述语言的语义要比描述语言的语法难得多。因此,在定义语言的语义时,我们将使用非形式化方法和启发性实例。
上下文无关文法除了可以用于定义语言的语法之外,还可用于指导源程序的翻译。面向语法的编译技术,如语法制导翻译技术,对于组织编译器的前端十分有用,本章将广泛应用语法制导翻译技术。
25在讨论语法制导翻译技术的过程中,我们将构造一个把中缀表达式转换成后缀表达式的编译器。在后缀表达式中,操作符出现在操作数的后面。例如,中缀表达式9-5+2的后缀表达形式为95-2+。我们可以使用一个堆栈把后缀表达式直接转换成计算该表达式的计算机代码。作为起步,我们先构造一个简单的程序,这个程序把由加号和减号分隔的数字所构成的表达式转换成后缀形式。在基本概念清晰以后,我们扩展该程序使之能够处理更一般化的程序设计语言结构。本书中每个功能较强的翻译器都是通过扩展功能较弱的翻译器而得到的。
25
在我们的编译器里,词法分析器首先把输入字符流转换成记号流。然后,记号流作为下一个阶段的输入,产生源程序的中间表示,这个过程如图 2-1所示。图中的“语法制导翻译器” 由一个语法分析器和一个中间代码生成器构成。我们之所以把由数字和操作符组成的表达式作 为起点是为了使最初的词法分析简单,即每个输入字符就是一个记号。以后,我们将扩展该语 言,使其包含数、标识符、关键字等复杂词法结构。对于这个扩展的语言,我们将构造一个词 法分析器用于扫描连续的输入字符并将其转换成适当的记号。词法分析器的构造将在第 3章详细讨论。
字符流
字符流
中间表示
语法制导翻译器
词法分析器
记号流
语法定义
图2-1 我们的编译器前端的结构
本节介绍一种定义语言语法的表示法,称为上下文无关文法(简称文法)。上下文无关文法将贯穿本书始末,作为编译器前端定义的一部分。
一个语法非常自然地描述了许多程序设计语言结构的层次结构。例如, C语言中的 if-else
PAGE 18第 2
PAGE 18
第 2 章
PAGE 19简单的一遍编译器
PAGE 19
简单的一遍编译器
表 达 式 语 句
表 达 式 语 句
语句
也就是说,整个语句是由关键字 if、一个左括号、一个表达式、一个右括号、一条语句、关键字 else 和另外一条语句组成的序列(在C语言中,没有关键字 then)。如果使用变量 expr 来标识表达式,使用变量 stmt 来标识一条语句,则 if-else 语句的构造规则可以表达为
(2-1)
这里,箭头可以读作“可以具有形式”。这样的规则称为产生式( production)。在一个产生式中,像关键字 if 和括号这样的词法元素称为记号(token),像 expr 和 stmt 这样的变量表示一个记号序列,并称之为非终结符(nonterminal)。
上下文无关文法包含如下四个部分:
26一个记号集合,称为终结符号。
26
一个非终结符集合。
一个产生式集合。每个产生式具有一个左部和一个右部,左部和右部由箭头连接,左部是一个非终结符。右部是记号和(或)非终结符序列。
一个开始符号。开始符号是一个指定的非终结符。
我们约定,定义语法时只需列出文法的产生式,并把以开始符号为左部的产生式列在最前面。在以后的讨论中我们假设:数字、类似于=的符号、类似于 while 的黑体字符串均为终结符,斜体名字表示非终结符,任何非斜体的名字或者符号都是记号 。为了表示上的方便,我们常把具有相同左部的产生式合并,写成一个产生式,其左部为所有产生式共有的那个非终结符,右部为所有产生式右部的组合,每个右部用“ |”分隔。“|”读做“或”。
例2.1 本章的例子均使用由数字、加号和减号组成的表达式,如9-5+2、3-1、7等。因为加号和减号必须出现在两个数字之间,我们称这样的表达式为“用加号和减号分隔的数字序 列”。下面的文法描述了这些表达式的语法。产生式为
左部的非终结符皆为 list (列表)的三个产生
文档评论(0)