第1章 编译概述 1
1.1 翻译程序与编译程序 1
1.2 编译过程和编译程序的基本结构 2
1.3 编译程序的生成方法 5
1.4 编译技术在软件开发中的应用 6
本章小结 6
自测练习题1 7
习题1 7
2.2.1 字母表和符号串 8
2.2 字母表和符号串的基本概念 8
2.1 概述 8
第2章 文法和语言的基本知识 8
2.2.2 符号串的运算 9
2.3 文法和语言的形式定义 10
2.3.1 形式语言 10
2.3.2 文法的形式定义 11
2.3.3 语言的形式定义 14
2.3.4 规范推导和规范归约 16
2.3.5 递归规则与文法的递归性 17
2.4 短语、直接短语和句柄 18
2.4.1 短语和直接短语 18
2.5 语法树与文法的二义性 19
2.5.1 推导和语法树 19
2.4.2 句柄 19
2.5.2 文法的二义性 22
2.5.3 文法二义性的消除 22
2.6 文法和语言的分类 24
2.7 有关文法的实用限制和变换 26
本章小结 26
自测练习题2 27
习题2 30
第3章 词法分析与有穷自动机 32
3.1 词法分析程序的功能 32
3.2 单词符号及输出单词的形式 32
3.2.2 词法分析程序输出单词的形式 33
3.2.1 语言的单词符号 33
3.3 语言单词符号的两种定义方式 34
3.3.1 正规式与正规集 34
3.3.2 正规文法与正规式 35
3.4 正规式与有穷自动机 38
3.4.1 确定有穷自动机(DFA) 38
3.4.2 非确定有穷自动机(NFA) 39
3.4.3 由正规表达式R构造NFA 40
3.4.4 NFA确定化为DFA的方法 41
3.4.5 DFA的化简 44
3.4.6 有穷自动机到正规式的转换 46
3.5.1 右线性正规文法到有穷自动机的转换方法 47
3.5 正规文法与有穷自动机 47
3.5.2 左线性正规文法到有穷自动机的转换方法 48
3.5.3 有穷自动机到正规文法的转换方法 48
3.6 词法分析程序的编写方法 49
本章小结 53
自测练习题3 54
习题3 55
第4章 语法分析 57
4.1 语法分析程序的功能 57
4.2 自上而下分析法 57
4.2.1 非确定的自上而下分析法的思想 57
4.2.2 文法的左递归性和回溯的消除 58
4.2.3 某些非LL(1)文法到LL(1)文法的改写 62
4.2.4 递归下降分析法 64
4.2.5 预测分析法与预测分析表的构造 65
4.3 自下而上分析法的一般原理 68
4.4 算符优先分析法 69
4.4.1 方法概述 69
4.4.2 算符优先文法的定义 70
4.4.3 算符优先关系表的构造 71
4.4.4 算符优先分析算法的设计 72
4.4.5 优先函数的构造 75
4.4.6 算符优先分析法的局限性 77
4.5.1 LR分析器的工作原理和过程 78
4.5 LR分析法 78
4.5.2 LR(0)分析法 81
4.5.3 SLR(1)分析法 85
4.5.4 LR(1)分析法 89
4.5.5 LALR(1)分析法 92
4.5.6 LR分析法对二义性文法的应用 95
本章小结 96
自测练习题4 98
习题4 100
5.1 概述 103
5.2 属性文法 103
第5章 语法制导翻译技术和中间代码生成 103
5.3 语法制导翻译概述 105
5.4 中间语言 107
5.4.1 逆波兰式 107
5.4.2 三元式和树形表示 108
5.4.3 四元式和三地址代码 110
5.5 自下而上语法制导翻译 110
5.5.1 简单算术表达式和赋值语句的翻译 111
5.5.2 布尔表达式的翻译 112
5.5.3 控制语句的翻译 118
5.5.4 循环语句的翻译 120
5.5.5 简单说明语句的翻译 122
5.5.6 含数组元素的赋值语句的翻译 123
5.6 递归下降语法制导的翻译 126
本章小结 128
自测练习题5 128
习题5 129
第6章 符号表的组织与管理 131
6.1 符号表的作用 131
6.2 符号表的组织 133
6.3 符号表的建立和查找 136
自测练习题6 139
习题6 139
本章小结 139
第7章 代码优化 140
7.1 优化概述 140
7.2 局部优化 144
7.2.1 划分基本块的方法 144
7.2.2 基本块的DAG表示 144
7.2.3 利用DAG进行基本块的优化处理 148
7.3 循环优化 149
7.3.1 程序流图与循环 150
7.3.2 循环查找 151
7.3.3 循环优化 153
7.4 窥孔优化 157
自测练习题7 159
本章小结 159
习题7 160
第8章 运行时的存储组织与管理 161
8.1 概述 161
8.2 静态存储分配 162
8.3 栈式存储分配 163
8.3.1 简单栈式存储分配 163
8.3.2 嵌套过程的栈式存储分配 165
8.4 堆式存储分配 166
8.5 临时变量的存储分配 167
本章小结 168
自测练习题8 168
习题8 169
第9章 目标代码生成 170
9.1 概述 170
9.2 假想的计算机模型 170
9.3 简单代码生成器 171
9.3.1 待用信息与活跃信息 171
9.3.2 代码生成算法 173
9.3.3 寄存器的分配 174
9.4 代码生成器的自动生成技术 174
本章小结 175
自测练习题9 175
习题9 175
10.1 并行编译技术的引入 176
第10章 并行编译技术基本常识 176
10.2 并行编译系统的功能和结构 177
10.2.1 并行编译系统的功能 177
10.2.2 并行编译系统的结构 177
10.3 向量语言编译技术 178
10.3.1 向量语法处理 178
10.3.2 向量结构优化 179
10.4 共享存储器并行机并行编译技术 179
10.4.1 预编译 179
10.4.2 可再入的目标代码 179
习题10 180
本章小结 180
附录A 词法分析程序生成器LEX 181
A.1 词法分析程序生成器LEX简介 181
A.2 LEX输入文件的格式 181
A.3 正规表达式的LEX约定 182
A.4 LEX源程序中的规则部分 184
A.5 FLEX的命令选项 185
A.6 LEX程序示例 185
附录B 语法分析程序生成器YACC 187
B.1 语法分析程序YACC简介 187
B.2 YACC输入文件的格式 187
B.3.1 定义部分 188
B.3 YACC各部分的书写格式 188
B.3.2 规则部分 191
B.3.3 辅助程序部分 192
B.4 YACC的内置名称和定义机制 192
B.5 YACC源程序示例 193
附录C 编译程序实验 195
C.1 词法分析 195
C.1.1 实验目的 195
C.1.2 实验要求 195
C.1.3 词法分析程序的算法思想 196
C.1.4 词法分析程序的C语言程序框架 196
C.2.2 实验要求 199
C.2 语法分析 199
C.2.1 实验目的 199
C.2.3 语法分析程序的算法思想 200
C.2.4 语法分析程序的C语言程序框架 201
C.3 语义分析 203
C.3.1 实验目的 203
C.3.2 实验要求 203
C.3.3 语义分析程序的C语言程序框架 204
C.4 算符优先分析法 206
C.5 实验实例 207
附录D 自测练习题与习题参考答案 225
参考文献 246