第1章 概述 1
1.1 程序设计语言与程序 1
1.1.1 程序设计语言的定义 1
1.1.2 程序设计语言的分类 1
1.1.3 程序及其结构 2
1.1.4 高级语言程序的处理过程 3
1.2 编译程序 4
1.2.1 编译与解释 4
1.2.2 编译过程和编译程序的结构 5
1.2.3 编译程序的生成 10
1.2.4 编译程序与程序设计环境 12
1.3 编译技术的应用 13
1.4 本章小结 13
1.5 习题 14
第2章 形式语言和文法 15
2.1 形式语言 15
2.1.1 语言的概念 15
2.1.2 语言的定义方式 17
2.2 文法 18
2.2.1 文法的形式定义 18
2.2.2 文法的表示方法 19
2.2.3 相关概念 21
2.3 文法的分类和化简 23
2.3.1 文法的分类 23
2.3.2 两个定理 25
2.3.3 文法的化简 26
2.4 文法的二义性 26
2.5 典型例题 29
2.6 本章小结 30
2.7 习题 31
第3章 有穷自动机 33
3.1 正规式与正规集 33
3.1.1 概念 33
3.1.2 正规式和正规文法的等价性 35
3.2 有穷自动机 37
3.2.1 有穷自动机 37
3.2.2 确定的有穷自动机 38
3.2.3 不确定的有穷自动机 39
3.2.4 NFA与DFA的等价性 40
3.2.5 DFA的化简 43
3.3 正规式和FA的等价性 46
3.3.1 构造与FA等价的正规式 46
3.3.2 构造与正规式等价的FA 49
3.4 正规文法和FA的等价性 51
3.4.1 构造与正规文法等价的FA 51
3.4.2 构造与FA等价的正规文法 53
3.5 典型例题 53
3.6 本章小结 58
3.7 习题 58
3.8 实验 59
第4章 词法分析 63
4.1 词法分析的任务 63
4.2 程序设计语言的单词 63
4.2.1 单词的种类 63
4.2.2 单词的机内表示方法 64
4.3 单词的形式描述 66
4.3.1 正规式描述 66
4.3.2 正规文法描述 67
4.4 词法分析程序的构造 68
4.4.1 根据DFA构造词法分析程序 68
4.4.2 词法分析程序构造的相关问题 71
4.5 词法分析程序的自动生成工具LEX简介 74
4.5.1 LEX语言源程序 74
4.5.2 LEX编译程序工作原理 76
4.6 典型例题 76
4.7 本章小结 77
4.8 习题 78
4.9 实验 79
第5章 自顶向下语法分析 82
5.1 程序设计语言的语法描述 82
5.2 自顶向下的语法分析概述 83
5.2.1 自顶向下的语法分析方法 83
5.2.2 确定的自顶向下的语法分析方法 84
5.2.3 不确定的自顶向下的语法分析方法 85
5.3 LL(1)文法 86
5.3.1 “回溯”的原因 86
5.3.2 “回溯”的消除 88
5.3.3 LL(1)文法的定义 90
5.4 预测分析法 95
5.4.1 预测分析表 95
5.4.2 分析栈 96
5.4.3 预测分析程序 97
5.5 递归下降分析法 98
5.6 典型例题 101
5.7 本章小结 104
5.8 习题 104
5.9 实验 106
第6章 算符优先分析 109
6.1 自底向上语法分析概述 109
6.1.1 自底向上语法分析过程 109
6.1.2 自底向上语法分析的实现 110
6.1.3 短语和句柄 112
6.2 简单优先分析法 114
6.2.1 优先关系 115
6.2.2 简单优先文法 116
6.2.3 简单优先分析法 117
6.3 算符优先分析法 118
6.3.1 算符优先文法 119
6.3.2 算符优先分析算法 122
6.4 优先函数 125
6.4.1 优先函数的定义 126
6.4.2 优先函数的构造 126
6.5 典型例题 128
6.6 本章小结 131
6.7 习题 132
6.8 实验 133
第7章 LR分析法 135
7.1 LR分析概述 135
7.1.1 分析思想 135
7.1.2 分析器组成 136
7.2 LR(0)分析表 137
7.2.1 LR(0)项目集规范族 137
7.2.2 LR(0)文法 143
7.2.3 LR(0)分析器的工作过程 146
7.3 SLR(1)分析表 147
7.3.1 SLR(1)文法 147
7.3.2 SLR(1)分析表的构造 148
7.4 LR(1)分析表 149
7.4.1 LR(1)文法 149
7.4.2 LR(1)项目集规范族的构造 151
7.4.3 LR(1)分析表的构造 153
7.5 LALR(1)分析表 153
7.5.1 LALR(1)文法 153
7.5.2 LALR(1)分析表的构造 155
7.6 语法分析程序的自动生成工具YACC简介 156
7.6.1 YACC对语言的要求 156
7.6.2 YACC的输入/输出 157
7.6.3 YACC源程序 157
7.7 典型例题 158
7.8 本章小结 162
7.9 习题 162
7.10 实验 164
第8章 语义分析和中间代码生成 167
8.1 语义分析 167
8.1.1 语义分析的任务 167
8.1.2 语义的描述 168
8.2 中间代码 170
8.2.1 逆波兰式 170
8.2.2 树代码 171
8.2.3 三地址码 172
8.3 自底向上语法制导翻译 174
8.3.1 语法制导翻译概述 175
8.3.2 说明语句的翻译 176
8.3.3 含简单变量的赋值语句的翻译 180
8.3.4 含数组元素的赋值语句的翻译 182
8.3.5 布尔表达式的翻译 183
8.3.6 控制语句的翻译 190
8.3.7 过程调用 198
8.4 典型例题 199
8.5 本章小结 202
8.6 习题 202
第9章 符号表 204
9.1 符号表的作用 204
9.2 符号表的内容 205
9.3 符号表的组织 208
9.3.1 符号表的总体组织 208
9.3.2 符号表的构造方法 208
9.3.3 域的组织 212
9.4 栈式符号表 213
9.5 符号表的管理 216
9.6 典型例题 217
9.7 本章小结 218
9.8 习题 218
第10章 运行时存储空间的组织 220
10.1 运行时存储空间的划分 220
10.2 数据空间的分配策略 221
10.2.1 静态存储分配策略 221
10.2.2 动态存储分配策略 221
10.3 栈式存储分配 225
10.3.1 简单程序设计语言的栈式存储分配 225
10.3.2 嵌套过程语言的栈式存储分配 228
10.4 典型例题 234
10.5 本章小结 235
10.6 习题 235
第11章 代码优化 237
11.1 代码优化概述 237
11.2 局部优化 237
11.2.1 基本块及其划分 237
11.2.2 基本块的优化技术 240
11.2.3 基本块优化技术的实现 243
11.3 循环优化 249
11.3.1 程序中的循环 249
11.3.2 循环的优化技术及其实现 252
11.4 典型例题 256
11.5 本章小结 259
11.6 习题 260
11.7 实验 261
第12章 目标代码生成 263
12.1 目标代码生成概述 263
12.2 模型计算机的指令系统 263
12.2.1 寻址方式 264
12.2.2 指令系统 264
12.3 一种简单代码生成算法 265
12.3.1 寄存器的使用原则 265
12.3.2 待用信息和活跃信息 266
12.3.3 寄存器描述和变量地址描述 269
12.3.4 基本块代码生成算法 270
12.4 DAG的目标代码生成 273
12.5 典型例题 274
12.6 本章小结 275
12.7 习题 276
附录A 综合实验 277
A.1 S语言说明 277
A.1.1 字符集的定义 277
A.1.2 单词集的定义 277
A.1.3 数据类型定义 277
A.1.4 表达式定义 277
A.1.5 语句定义 278
A.1.6 程序定义 278
A.1.7 源程序书写格式的规定 278
A.2 实验一词法分析程序 279
A.2.1 任务 279
A.2.2 要求 279
A.2.3 数据结构 280
A.2.4 程序参考结构及模块说明 281
A.3 实验二语法/语义分析程序 281
A.3.1 任务 281
A.3.2 要求 282
A.3.3 数据结构 282
A.3.4 程序参考结构及模块说明 283
A.4 实验三 目标代码生成程序 284
A.4.1 任务 284
A.4.2 要求 285
A.4.3 数据结构 285
A.4.4 程序参考结构及模块说明 285
参考文献 287