目录 1
前言 1
第1章 编译引论 1
1 1 程序设计语言和编译程序 1
1 2 编译程序的结构 2
1 2 1 编译程序的构成 2
1 2 2 遍 4
1 2 3 编译程序的前端和后端 4
1 3 编译程序和程序设计环境 5
1 4 编译程序的实现 6
习题 7
第2章 形式语言与自动机理论基础 8
2 1 语言和文法 8
2 1 1 基本概念 8
2.1 2 文法分类 11
2 1 3 推导和归约 13
2.1 4 语法树与文法二义性 14
2 1 5 文法等价变换 16
2 2 有限自动机(FA) 20
2 2 1 确定有限自动机(DFA) 21
2 2 2 非确定有限自动机(NFA) 23
2 2 3 DFA与NFA的等价 24
2 2 4 DFA的化简 26
2 3 正则表达式 28
习题 32
第3章 词法分析 33
3 1 词法分析介绍 33
3 1 1 词法分析程序的功能 33
3 1 2 词法分析程序的接口 33
3.2 2 单词的内部表示 34
3.2.3 单词的形式描述 34
3.2 词法分析程序的设计 34
3.2 1 单词分类 34
3.2 4 自动机的实现 35
3 3 词法分析程序的实现 37
3 3 1 实现词法分析程序应注意的问题 37
3 3.2 标识符表和常量表 39
3 3 3 单词结构 39
3 3 4 实现算法 39
3.4 1 LEX简介 41
3.4 2 LEX工作原理 41
3 4 词法分析程序自动生成 41
3 4 3 LEX源文件结构 42
3.4 4 LEX系统中的正则式 43
3.4.5 LEX的使用方式 46
3 4.6 应用实例 46
习题 47
4 1.1 语法分析程序的功能 48
4.1.2 语法错误类别及错误处理 48
4 1 语法分析程序介绍 48
第4章 语法分析——自顶向下分析方法 48
4.1 3 自顶向下语法分析的基本思想 49
4.1 4 三个重要的集合 51
4 1 5 自顶向下语法分析条件 52
4 2 递归下降法 53
4.2.1 递归下降法语法分析原理 53
4 2 2 递归下降法语法分析程序的构造 54
4 3 LL(1)分析法 56
4.3.1 LL(1)分析法原理 56
4 3.2 LL(1)分析表的构造 57
4.3.3 LL(1)驱动程序构造 58
4 4 自顶向下分析程序的自动生成 59
习题 60
第5章 语法分析——自底向上分析方法 61
5 1 自底向上语法分析方法介绍 61
5.2 简单优先分析 62
5.2 1 简单优先文法及其优先关系矩阵的构造 62
5.2.2 简单优先分析算法 63
5 3 LR(k)分析法 64
5 3 1 LR(k)分析法的工作过程 65
5 3 2 LR(0)分析法 66
5 3 3 SLR(1)分析法 72
5 3 4 LR(1)分析法 75
5 3 5 LALR(1)分析法 78
5 3 6 小结 80
5 4 自底向上分析程序的自动生成 82
习题 83
第6章 语义分析和符号表 85
6 1 语义分析概述 85
6 2 标识符的内部表示 86
6 3 类型的内部表示 90
6 4 值的内部表示 93
6 5 2 符号表项的排列 94
6.5 1 符号表的总体组织 94
6 5 符号表的组织和管理 94
6 5 3 符号表的建立与查找 96
6 6 嵌套式符号表和分程序结构的管理 98
6 6 1 简单C语言的符号表 98
6 6 2 Pascal语言的符号表 99
6 6 3 带有分程序结构的符号表 101
6 7 标号的语义分析 103
习题 104
7 1 2 抽象语法树和有向无环图 106
7 1 1 后缀式 106
7 1 常用的中间代码结构 106
第7章 中间代码生成 106
7 1 3 三地址中间代码 107
7 2 语法制导方法概论 108
7 3 类型检查和类型转换 110
7 4 中间代码生成中的几个问题 110
7 4 1 语义信息的获取和保存 110
7 4 2 语义栈Sem及其操作 111
7 4 3 常用的语义子程序 111
7 5 表达式的中间代码生成 112
7 6 1 下标变量的地址 114
7 6 下标变量的中间代码生成 114
7 6 2 下标变量的四元式结构 115
7 6 3 下标变量的中间代码生成 115
7 6 4 下标变量中间代码生成举例 116
7 7 赋值语句的中间代码 117
7 8 过程调用和函数调用的中间代码 118
7 9 控制语句的中间代码生成 119
7.9 1 goto语句和标号定位的中间代码 120
7 9.2 条件语句的中间代码 120
7 9 3 while语句的中间代码 121
7 10 过程/函数声明的中间代码生成 122
习题 123
第8章 中间代码优化 124
8 1 优化方法概述 124
8 2 基本块划分 126
8 3 常量表达式局部优化 127
8 4 公共表达式局部优化 128
8.5 循环不变式外提 130
8.5 1 循环不变式外提概述 130
8 5 2 循环不变式外提原理 133
8 6 其它各类优化介绍 134
习题 136
第9章 运行时存储空间的组织与管理 137
9 1 目标程序运行时的活动 137
9 1 1 过程的活动 137
9.1 2 名字的作用域和绑定 138
9.1 3 过程活动记录 138
9.1.4 抽象地址分配 140
9.1.5 参数传递 142
9 2 运行时存储器的划分 144
9 3 静态存储分配 145
9 4 简单的栈式存储分配 146
9 5 嵌套式语言的栈式存储分配 147
9.5.1 局部Display表方法 149
9 5 2 静态链方法 151
9 5 3 全局Display表方法 152
9 6 堆式动态存储分配 154
9.6 1 堆区的分配策略 154
9 6.2 堆区的回收策略 156
9 7 过程调用中几种特殊情况的处理 157
9 7 3 过程的奇特型调用 158
9 7.2 形式过程语句 158
9 7.1 非正常出口语句 158
习题 159
第10章 目标代码生成 161
10 1 目标代码生成介绍 161
10 1 1 代码生成器的输入和输出 161
10 1.2 指令选择 161
10 2 虚拟机 162
10 3 寄存器的分配 164
10 3 1 单寄存器机器的寄存器分配 164
10 3 2 多寄存器机器的寄存器分配 164
10 4 1 表达式四元式的翻译 165
10 4 四元式到目标代码的翻译 165
10 4 2 赋值语句四元式的翻译 166
10 4 3 输入输出语句四元式的翻译 166
10 4 4 条件语句四元式的翻译 167
10 4 5 循环语句四元式的翻译 168
10 4 6 标号语句四元式和goto语句四元式的翻译 169
10 4 7 过程、函数说明语句四元式的翻译 170
10 4 8 过程、函数调用语句四元式的翻译 170
习题 171
参考文献 173