编译程序的设计与实现
刘磊 金英
张晶 张荷花 单郸
编 著
吉林大学计算机科学与技术学院
2004 年 2 月
简 介
编译程序是计算机系统不可缺少的部分,是程序设计者
的必备工具。学习并掌握编译程序的构造原理和实现技术,
能够增强对程序设计语言的理解,提高程序设计、尤其是大
型软件的设计能力。
本教材以一个简单的具有嵌套过程定义的过程式语言
SNL 作为教学语言,详细介绍了该语言编译程序的设计和实
现方法,并且对已经实现的编译程序的源代码分阶段进行了
详细的分析,尤其是对编译器程序的组成、实现算法、所用
数据结构以及各功能部分所采用的编译技术都作了详细的
介绍,并配有相应的框图说明。学生在学习《编译原理》课
程的同时,可以配合本教材中编译实例的分析,进一步理解
和掌握编译器程序的构造原理和实现方法。此外,通过对本
教材中所提供的编译程序源代码的阅读和改进,可以大大地
提高程序设计能力。本教材是一本难得的编译程序实例分析
和教学辅导教材。
1
目 录
前 言................................................................................................................................. 1
第一章 编译原理概述
1.1 高级程序设计语言的实现................................................................................. 1
1.2 编译程序的组成................................................................................................. 2
1.3 编译程序的实现................................................................................................. 4
1.4 其他相关程序..................................................................................................... 5
第二章 SNL 语言介绍
2.1 SNL语言的特点 ................................................................................................. 6
2.2 SNL语言的词法 ................................................................................................. 6
2.2.1 语言的字符表.................................................................................. 6
2.2.2 单词的巴科斯范式.......................................................................... 6
2.3 SNL语言的语法 ................................................................................................. 7
2.3.1 语法的非形式说明.......................................................................... 7
2.3.2 语法的形式定义.............................................................................. 8
2.4 SNL语言的语义 ............................................................................................... 13
第三章 SNL 语言的编译程序简介
3.1 SNL编译程序功能结构 ................................................................................... 14
3.2 SNL编译器的开发环境 ................................................................................... 16
3.3 SNL编译器程序包 ........................................................................................... 16
3.4 SNL编译器的主程序说明 ............................................................................... 25
第四章 SNL 语言的词法分析
4.1 词法分析简介................................................................................................... 31
4.1.1 单词的分类.................................................................................... 31
4.1.2 单词的Token表示.......................................................................... 32
4.1.3 词法分析程序和语法分析程序的接口 ........................................ 32
4.2 DFA的构造和实现 ........................................................................................... 33
4.2.1 状态转换图.................................................................................... 33
4.2.2 状态转换图的实现........................................................................ 36
4.3 词法分析程序的实现....................................................................................... 38
2
4.3.1 词法分析程序的输入输出............................................................ 38
4.3.2 实现词法分析器的注意事项 ........................................................ 39
4.3.3 词法分析程序的实现框图............................................................ 40
4.4 词法分析程序的自动生成器........................................................................... 44
4.4.1 LEX/FLEX简介 .............................................................................. 44
4.4.2 LEX运行与应用过程 ..................................................................... 44
4.4.3 LEX源程序结构 ............................................................................. 45
4.4.4 应用LEX构造词法分析程序 ........................................................ 47
第五章 SNL 语言的语法分析
5.1 语法分析概述................................................................................................... 52
5.1.1 上下文无关文法............................................................................. 52
5.1.2 语法分析方法的分类..................................................................... 54
5.1.3 三个重要集合................................................................................. 54
5.1.4 SNL 语言的Predict集 .................................................................... 55
5.2 语法分析程序的实现....................................................................................... 57
5.2.1 语法分析程序的输入与输出 ......................................................... 57
5.2.2 语法树节点的数据结构 ................................................................. 58
5.3 递归下降法的实现........................................................................................... 63
5.3.1 递归下降法基本原理..................................................................... 63
5.3.2 递归下降法应满足的条件 ............................................................. 63
5.3.3 递归下降法的语法分析程序框图 ................................................. 64
5.4 LL(1)语法分析方法的实现 ........................................................................... 107
5.4.1 LL(1)语法分析方法的基本原理.................................................. 107
5.4.2 SNL语言的LL(1)语法分析概述.................................................. 108
5.4.3 LL(1)语法分析程序框图 ............................................................. 108
5.5 语法分析程序的自动生成器......................................................................... 143
5.5.1 YACC/Bison.................................................................................. 143
5.5.2 ACCENT....................................................................................... 148
第六章 符号表管理与语义分析
6.1 语义分析概述................................................................................................... 154
6.2 符号表管理..................................................................................................... 154
6.2.1 符号表的内容.............................................................................. 155
6.2.2 符号表的组织.............................................................................. 159
6.2.3 符号表的操作.............................................................................. 161
6.2.4 符号表的实现.............................................................................. 161
6.3 语义分析实现................................................................................................. 163
6.3.1 输入输出....................................................................................... 164
3
6.3.2 算法框图....................................................................................... 164
第七章 中间代码生成
7.1 中间代码简介................................................................................................. 177
7.1.1 中间代码的表示形式................................................................... 178
7.1.2 中间代码的生成方法................................................................... 179
7.2 SNL的中间语言 ............................................................................................. 179
7.3 SNL的中间代码生成 ..................................................................................... 182
7.3.1 输入输出....................................................................................... 182
7.3.2 中间代码的构造方法................................................................... 182
7.3.3 从语法树生成四元式................................................................... 186
7.3.4 相关的应用函数........................................................................... 187
7.3.5 中间代码生成程序说明 ............................................................... 189
第八章 中间代码优化
8.1 中间代码优化简介......................................................................................... 199
8.1.1 优化种类介绍............................................................................... 199
8.1.2 基本块的划分............................................................................... 200
8.2 常量表达式优化............................................................................................. 201
8.2.1 常量表达式优化的原理 ............................................................... 201
8.2.2 常量表达式节省的实现 ............................................................... 202
8.3 公共表达式节省方法..................................................................................... 207
8.3.1 公共表达式优化原理................................................................... 207
8.3.2 公共表达式节省的实现 ............................................................... 209
8.4 循环不变式外提............................................................................................. 216
8.4.1 循环不变式外提的原理 ............................................................... 217
8.4.2 循环外提的实现........................................................................... 220
第九章 SNL 语言的目标代码生成
9.1 虚拟目标机TM............................................................................................... 226
9.1.1 TM的寄存器和存储器................................................................. 226
9.1.2 TM的地址模式和指令集............................................................. 227
9.2 编译程序中运行时存储空间管理................................................................. 228
9.2.1 存储空间结构............................................................................... 228
9.2.2 过程活动记录............................................................................... 229
9.2.3 动态链........................................................................................... 231
9.3 语法树到目标代码的生成............................................................................. 232
9.3.1 原理............................................................................................... 232
4
9.3.2 框图............................................................................................... 236
9.4 四元式到目标代码的生成............................................................................. 246
9.4.1 原理............................................................................................... 246
9.4.2 四元式到目标代码生成中的关键问题 ....................................... 251
9.4.3 程序框图....................................................................................... 252
第十章 虚拟目标代码的解释程序
10.1 解释程序....................................................................................................... 264
10.2 虚拟目标机TM的可执行命令..................................................................... 264
10.3 解释程序的实现........................................................................................... 265
10.3.1 解释程序的实现框图................................................................. 265
第十一章 总结
11.1 语言的扩充和实现......................................................................................... 274
11.2 实现方法的扩充............................................................................................. 274
11.3 应用自动生成工具......................................................................................... 274
11.4 实现语言......................................................................................................... 275
第十二章 SNLC(SNL Compiler)软件使用指南
12.1 SNLC概述........................................................................................................ 276
12.1.1 SNLC的特色.................................................................................. 276
12.1.2 SNLC的运行环境.......................................................................... 276
12.1.3 SNLC的安装和卸载...................................................................... 276
12.1.4 SNLC的启动和退出...................................................................... 279
12.2 SNLC的使用.................................................................................................... 279
12.2.1 SNL文件的操作 ............................................................................ 280
12.2.2 SNL程序的词法分析 .................................................................... 281
12.2.3 SNL程序的语法分析 .................................................................... 281
12.2.4 SNL程序的语义分析 .................................................................... 282
12.2.5 SNL程序的中间代码生成 ............................................................ 283
12.2.6 SNL程序的优化 ............................................................................ 285
12.2.7 SNL程序的目标代码生成 ............................................................ 287
12.2.8 SNL程序的虚拟执行 .................................................................... 288
12.3 有关问题的说明.............................................................................................. 291
12.3.1 SNLC的维护和出错处理.............................................................. 291
12.3.2 SNLC的帮助功能.......................................................................... 291
参考文献………………………………………………………………………………..292
5
前 言
前言
编译原理课程是计算机科学与技术专业最为重要的专业课之一,掌握编译方法
和技术是每一个优秀计算机软件专业人员的必备素质。对于计算机专业的学生来说,
也许将来只有少部分人从事专业开发编译程序、维护编译程序的工作,但学好这门
课程是十分重要的,体现在:
1.学好编译课程可以加深对程序设计语言的理解,因为设计一个编译程序,需
要准确认识程序语言的语法和语义,了解目标机及目标代码的结构,这些知识对于
学习新的程序设计语言是非常有帮助的。
2.因为编译程序本身是一个十分庞大而复杂的系统软件,涉及到许多复杂的数
据结构和实现算法,若能系统全面的掌握编译技术,必将大大提高程序设计能力,
特别是开发大型软件的能力。
3.编译技术可以应用于许多实际的软件开发工作中,如软件开发平台、软件自
动生成、模式匹配等许多方面。
4.编译课程的学习可以培养学生的抽象思维能力,掌握形式化描述技术,这种
思想和方法可能对今后从事的软件开发工作产生深远的影响。
5.编译程序是一种元级程序,即它处理的对象就是程序,因此学习编译原理和
实现技术,对于我们掌握元级程序设计方法十分有帮助。
许多学过编译原理课程的同学都会感到有些困惑:首先觉得编译课程难度较大,
不易掌握;其次虽然掌握了编译的各个阶段的技术,但缺乏对编译程序的总体理解,
各部分之间难以衔接。针对这种情况,我们编写了本教材。
本 教 材 设 计 了 简 单 的 具 有 嵌 套 过 程 的 程 序 设 计 语 言 SNL(Small Nested
Language)。该语言具有标准数据类型和结构数据类型,可以嵌套定义过程,过程的
参数可以分为值参和变参两种形式,控制语句和 PASCAL 语言基本相同,因此除指
针类型外,SNL 语言具备了过程式语言的基本特征,以它作实例语言,构造其编译
程序,使得绝大多数编译技术可以在该编译程序中得以体现。
本教材介绍了 SNL 语言的编译程序的实现方法,并且对 SNL 编译程序的源代
码分阶段进行了详细的分析,尤其是对编译程序的组成、数据结构、所用算法以及
各功能部分所采用的编译技术都作了详细介绍,并配有框图说明。学生在学习《编
译原理》课程的同时,可以通过本教材中编译实例的分析,进一步理解和掌握编译
器程序的构造原理和实现方法,同时,通过对本教材中提供的编译程序源代码的阅
读和改进,可以大大地提高程序设计能力。
本书分为十二章,具体每章的主要内容如下:
第一章:简单介绍一下编译程序的构造原理;
第二章:介绍本教材使用的类 PASCAL 高级程序设计语言 SNL;
第三章:介绍 SNL 编译程序的总体结构和程序的组成;
1
第四章~第九章:分别介绍了 SNL 编译程序的词法分析、语法分析、语义分析、
中间代码生成、中间代码优化和目标代码生成部分的实现原理、具体
的程序说明以及源程序清单;
第十章:介绍了 SNL 编译程序的虚拟目标代码的解释程序的实现方法;
第十一章:总结了前面介绍的 SNL 编译程序,并指出了可以改进的方面和一些
其它的应用实例;
前言
第十二章:介绍了 SNL 编译器系统 SNLC(Small Nested Language’s Compiler)的
简明使用手册,以方便读者更好地使用 SNL 的编译器系统。
本书是作者根据多年教学实践经验总结而成,已在计算机科学与技术专业本科
生教学中使用多次,效果良好。北京工业大学计算机学院蒋宗礼教授认真审阅了本
书的全部初稿,并提出了很多中肯的修改意见,吉林大学计算机学院金成植教授在
本书的成书过程中也给予了多方面的指导。此外,吉林大学计算机学院软件自动化
实验室的教师、博士生和研究生的帮助和建议也对本书的出版起了积极的作用。在
此,作者向所有对本书编写工作给予支持和帮助的人表示衷心的感谢。由于编者水
平有限,时间匆忙,肯定会有不少缺点和不足,敬请读者多提宝贵意见,以便在适
当的时间再作修订补充。
2