第1章 概述 1
1.1程序设计语言与编译程序 1
1.1.1程序设计语言 1
1.1.2翻译程序 2
1.1.3编译程序和解释程序 3
1.1.4编译程序的伙伴 3
1.2编译过程和编译程序的结构 5
1.2.1编译过程概述 5
1.2.2编译程序的结构 8
1.2.3编译阶段的组合 9
1.3编译程序的设计 11
1.3.1编译程序的构造方式 11
1.3.2 Sample语言编译程序的设计 12
1.4编译程序的发展及应用 13
1.4.1编译程序的发展 13
1.4.2为什么要学习编译原理及其构造技术 14
1.4.3编译技术的应用 14
1.5小结 16
1.6习题 16
第2章 高级语言设计基础 17
2.1符号和符号串 17
2.2文法与语言 18
2.2.1文法的定义 19
2.2.2文法产生的语言 21
2.2.3文法的二义性 23
2.2.4文法的分类 25
2.3高级语言的设计 26
2.3.1程序语言的定义 26
2.3.2冯·诺依曼体系结构与高级语言 27
2.3.3数据类型 29
2.3.4语句和控制结构 29
2.3.5语言设计的步骤 32
2.4语言设计实例 32
2.4.1 Sample语言字符集的定义 33
2.4.2 Sample语言单词的定义 33
2.4.3 Sample语言数据类型的定义 35
2.4.4 Sample语言表达式的定义 35
2.4.5 Sample语言语句的定义 35
2.4.6 Sample语言程序体和程序的定义 37
2.4.7符合Sample语言定义的源程序举例 37
2.5小结 38
2.6习题 38
第3章 词法分析 40
3.1词法分析的任务和功能 40
3.1.1词法分析的功能 40
3.1.2单词的类型和种别码 41
3.2词法分析器的设计 42
3.2.1词法分析程序的接口 43
3.2.2词法分析程序的总体设计 43
3.2.3词法分析程序的详细设计 45
3.2.4单词的识别和状态转换图 46
3.2.5符号表及其操作 48
3.2.6词法分析阶段的错误处理 49
3.3正规文法、正规式与有穷自动机 50
3.3.1正规文法 50
3.3.2正规式 51
3.3.3有穷自动机 52
3.3.4正规文法与有穷自动机的等价性 59
3.3.5正规式与有穷自动机的等价性 60
3.4词法分析程序的自动生成 63
3.4.1 LEX的概述 63
3.4.2 LEX源文件的书写 64
3.4.3 LEX的工作原理 69
3.4.4 LEX使用中的一些注意事项 71
3.4.5使用LEX自动生成Sample语言的词法分析程序 72
3.5小结 73
3.6习题 73
第4章 语法分析 77
4.1语法分析概述 77
4.2自上而下的语法分析 78
4.2.1自上而下分析方法中的问题探究 78
4.2.2递归下降分析方法 86
4.2.3预测分析方法 90
4.2.4 Sample语言自上而下语法分析程序的设计 95
4.3自下而上的语法分析 97
4.3.1自下而上分析方法概述 98
4.3.2算符优先分析法 101
4.3.3 LR分析法 110
4.4语法分析器的自动生成工具YACC 131
4.4.1 YACC概述 131
4.4.2 YACC源文件的格式 132
4.4.3 YACC的翻译规则 134
4.4.4 YACC的辅助程序 135
4.5语法分析程序中的错误处理 135
4.5.1语法分析中的错误处理的一般原则 135
4.5.2自上而下语法分析的错误处理 136
4.5.3自下而上语法分析的错误处理 139
4.6小结 143
4.7习题 143
第5章 语义分析和中间代码生成 147
5.1概述 147
5.1.1语义分析和中间代码生成的功能和任务 147
5.1.2静态语义检查 148
5.1.3语义处理 148
5.2属性文法和语法制导的翻译 151
5.2.1属性文法的定义 151
5.2.2综合属性的计算 153
5.2.3继承属性的计算 153
5.2.4语法制导的翻译方法 154
5.3常见语句的语法制导的翻译 156
5.3.1语义变量和语义函数 156
5.3.2常量说明语句的语义处理 157
5.3.3变量说明语句的语义处理 157
5.3.4算术表达式和简单赋值语句的翻译 159
5.3.5布尔表达式的翻译 161
5.3.6 if语句的翻译 167
5.3.7 do…while语句的翻译 169
5.3.8 for语句的翻译 170
5.4 Sample语言语法制导的翻译程序的设计 172
5.5小结 173
5.6习题 173
第6章 运行时存储空间的组织 176
6.1程序执行时的活动 176
6.1.1源程序中的过程 176
6.1.2过程执行时的活动 177
6.1.3名字的作用域 178
6.1.4参数的传递 178
6.1.5名字的绑定 179
6.2程序执行时的存储器组织 179
6.2.1程序执行时存储器的划分 180
6.2.2活动记录 181
6.2.3存储分配策略 182
6.3静态存储分配 183
6.3.1静态存储分配的性质 183
6.3.2静态存储分配的实现 184
6.3.3临时变量的地址分配 185
6.4栈式存储分配策略 185
6.5堆式存储分配 187
6.5.1堆式存储分配的主要问题 188
6.5.2堆式动态存储分配的实现 189
6.5.3存储回收 190
6.6小结 191
6.7习题 191
第7章 代码优化 192
7.1概述 192
7.1.1代码优化的地位 192
7.1.2基本块的概念及流图 193
7.2局部优化 195
7.2.1删除公共子表达式 196
7.2.2复写传播 196
7.2.3删除无用代码 197
7.2.4对程序进行代数恒等变换 197
7.2.5基本块的DAG表示及优化 198
7.3循环优化 202
7.3.1循环的定义 202
7.3.2代码外提 203
7.3.3强度削弱 204
7.3.4删除归纳变量 205
7.4小结 206
7.5习题 206
第8章 目标代码生成 209
8.1概述 209
8.2目标机器 211
8.3简单的代码生成算法 212
8.3.1中间代码的简单翻译方法 212
8.3.2引用信息和活跃信息 214
8.3.3寄存器描述和地址描述 216
8.3.4基本块的代码生成算法 217
8.4从DAG生成目标代码 219
8.5 Sample代码优化及目标代码生成器的设计 221
8.6小结 223
8.7习题 223
参考文献 225