1引论 1
1.1 程序设计语言与编译 1
1.2 编译程序概述 3
1.2.1 词法分析 3
1.2.2 语法分析 4
1.2.3 中间代码生成 5
1.2.4 优化 5
1.2.5 目标代码生成 6
1.2.6 表格与表格管理 6
1.2.7 出错处理 8
1.2.8 遍 9
1.3 编译程序生成 11
1.4 编译程序构造 12
习题 12
2编译基础知识 13
2.1 字母表与符号串 13
2.1.1 符号串集合的运算 13
2.1.2 符号串的前缀、后缀及子串 14
2.1.3 字母表的闭包与正闭包 14
2.2 文法与语言的关系 14
2.2.1 文法的直观概念 14
2.2.2 文法与语言的形式定义 18
2.3 文法构造与文法简化 21
2.3.1 由语言构造文法的例子 21
2.3.2 文法的简化 22
2.3.3 构造无ε产生式的上下文无关文法 23
2.4 语法树与文法的二义性 24
2.4.1 语法树 24
2.4.2 文法的二义性 26
习题 27
3词法分析 30
3.1 正规文法和有限自动机 30
3.1.1 正规文法、正规集与正规式 30
3.1.2 有限自动机 32
3.1.3 正规式与有限自动机之间的关系 37
3.1.4 正规文法与有限自动机 40
3.2 词法分析程序 42
3.2.1 预处理与超前搜索 42
3.2.2 扫描器的输出格式 44
3.2.3 扫描器的设计 46
3.3 词法分析程序的自动生成 52
3.3.1 LEX语言 53
3.3.2 LEX编译程序的构造 55
习题 57
4自上而下语法分析 60
4.1 下推自动机 60
4.2 自上而下分析法的一般问题 61
4.2.1 消除左递归 63
4.2.2 消除回溯——预测与提左因子 65
4.3 预测分析程序与LL(1)文法 66
4.3.1 求串α的终结首符集和非终结符A的随符集 68
4.3.2 构造预测分析表 70
4.3.3 状态表 72
4.4 递归下降分析法 74
习题 81
5优先分析法 84
5.1 简单优先分析方法 84
5.1.1 基本思想 84
5.1.2 有关文法的一些关系 85
5.1.3 优先矩阵的构造算法 89
5.1.4 简单优先分析算法 91
5.2 算符优先分析法 93
5.2.1 算符优先分析技术的引进 94
5.2.2 算符优先文法及优先表的构造 97
5.2.3 算符优先分析的若干问题 100
5.3 优先函数 104
习题 106
6LR分析法及分析程序自动构造 109
6.1 LR分析器 109
6.2 LR(0)项目集族和LR(0)分析表的构造 112
6.2.1 LR(0)项目集规范族的构造 114
6.2.2 LR(0)分析表的构造算法 115
6.3 SLR分析表的构造 116
6.4 规范LR分析表的构造 119
6.4.1 构造LR(1)项目集规范族的算法 120
6.4.2 构造LR(1)分析表的算法 121
6.5 LALR分析表构造 122
6.5.1 基本思想 123
6.5.2 构造LALR分析表的算法 124
6.6 二义文法的应用 126
6.7 分析表的自动生成 130
6.7.1 终结符和产生式的优先级 130
6.7.2 结合规则 131
6.7.3 LR分析表的安排 133
习题 134
7语法制导翻译并产生中间代码 136
7.1 概述 136
7.2 简单算术表达式和赋值语句的翻译 138
7.2.1 四元式 138
7.2.2 赋值语句的翻译 139
7.2.3 类型转换 141
7.3 布尔表达式的翻译 142
7.3.1 布尔表达式在逻辑演算中的翻译 142
7.3.2 控制语句中布尔式的翻译 143
7.4 控制语句的翻译 147
7.4.1 标号和转移语句 148
7.4.2 IF语句的翻译 149
7.4.3 WHILE语句的翻译 151
7.4.4 REPEAT语句的翻译 152
7.4.5 循环FOR语句的翻译 153
7.4.6 分情语句的翻译 155
7.4.7 复合语句的翻译 160
7.5 数组元素及其在赋值语句中的翻译 160
7.5.1 数组及其下标变量地址的计算 160
7.5.2 数组元素引用的中间代码形式 163
7.5.3 按行存放的赋值语句中数组元素的翻译 163
7.5.4 按列存放的赋值语句中数组元素的翻译 166
7.6 过程调用语句 168
7.6.1 参数传递 168
7.6.2 过程调用语句的翻译 170
7.6.3 过程调用和数组元素相混淆的处理 171
7.7 说明语句的翻译 171
7.7.1 分程序结构的符号表 171
7.7.2 整型、实型说明语句的翻译 174
7.7.3 常量定义语句的翻译 176
7.7.4 数组说明语句的翻译 176
7.7.5 过程说明语句的翻译 177
7.8 输入/输出语句的翻译 178
7.9 自上而下分析制导的翻译 179
7.9.1 算术表达式的翻译 179
7.9.2 布尔表达式的翻译 181
7.9.3 简单语句的翻译 183
7.9.4 LL(1)语法制导翻译 186
7.10 属性文法与属性翻译 188
7.10.1 属性文法与L属性文法 188
7.10.2 属性翻译 190
7.11 中间代码的其他形式 192
7.11.1 后缀表示法 192
7.11.2 三元式 196
7.11.3 间接三元式 197
7.11.4 树 197
习题 198
8运行时数据区的管理 202
8.1 静态存储管理 202
8.1.1 数据区 202
8.1.2 公用语句处理 204
8.1.3 等价语句处理 205
8.1.4 地址分配 207
8.1.5 临时变量地址分配 210
8.2 栈式存储管理 211
8.2.1 允许过程(函数)递归调用的数据存储管理 211
8.2.2 嵌套过程语言的栈式存储管理 214
8.3 堆式存储管理 219
8.3.1 堆式存储管理技术 219
9代码优化 225
9.1 优化概述 225
9.1.1 局部优化简介 225
9.1.2 循环优化简介 226
9.1.3 全局优化简介 228
9.2 局部优化 229
9.2.1 基本块 229
9.2.2 基本块的DAG表示 230
9.2.3 DAG在基本块优化中的作用 234
9.2.4 DAG构造算法讨论 236
9.3 控制流程分析和循环查找算法 238
9.3.1 程序流图与必经结点集 239
9.3.2 深度为主排序 240
9.3.3 查找循环算法 241
9.4 数据流分析 241
9.4.1 到达-定值数据流方程 242
9.4.2 引用-定值链(ud链) 244
9.4.3 活跃变量及数据流方程 244
9.5 循环优化 246
9.5.1 代码外提 246
9.5.2 强度减弱与归纳变量删除 248
习题 249
10目标代码生成 255
10.1 模型计算机的指令系统 255
10.2 一种简单代码生成算法 256
10.2.1 活跃信息与待用信息 256
10.2.2 寄存器和变量地址描述 257
10.2.3 代码生成算法 258
10.3 循环中寄存器分配 261
10.4 DAG结点的一种启发式排序 263
习题 266
附录1 EL语言编译程序 268
A.EL语言文法的扩充Backus表示法 268
B.EL语言编译程序构造的实践指导 269
C.扩充的EL语言文法与中间代码的解释执行程序 281
附录2 经典习题解析 285
参考文献 310