图书简介:
第1章 编译简述 1
1.1 程序的翻译 1
1.1.1 程序设计语言 1
1.1.2 编译程序 2
1.1.3 实现高级语言的编译方式 2
1.2 编译程序的组成 3
1.2.1 编译程序的构成 4
1.2.2 遍 5
1.2.3 编译程序前端和后端 5
1.3 编译程序的构造 5
1.4 小结 6
复习思考题 7
第2章 形式语言与词法分析 8
2.1 字母表和符号串的基本概念 8
2.1.1 字母表和符号串 9
2.1.2 符号串的运算 10
2.2 文法和语言的形式定义 11
2.2.1 形式语言 12
2.2.2 文法的形式定义 13
2.2.3 语言的形式定义 14
2.3 语法树与文法二义性 17
2.3.1 语法树 17
2.3.2 文法二义性 18
2.4 文法和语言的分类 19
2.5 词法分析的任务 20
2.5.1 词法分析的任务描述 20
2.5.2 词法分析器与语法分析器的接口 20
2.6 词法分析程序的输出形式 21
2.6.1 单词符号的分类 21
2.6.2 词法分析程序单词的输出形式 22
2.6.3 词法错误 23
2.7 词法分析程序的设计与实现 24
2.7.1 输入和预处理功能 24
2.7.2 单词符号的识别 25
2.7.3 状态转换图 26
2.7.4 状态转换图的实现 26
2.8 正规表达式与有限自动机 27
2.8.1 正规表达式与正规集 28
2.8.2 有限自动机 31
2.9 词法分析程序的自动生成工具Lex 40
2.10 实例语言的词法分析程序 43
2.10.1 微小语言Micro 43
2.10.2 Micro的词法分析 43
2.11 小结 45
复习思考题 46
第3章 自顶向下语法分析 50
3.1 自顶向下分析的一般方法 51
3.2 LL(1)文法 52
3.2.1 消除左递归 52
3.2.2 提取左因子 53
3.3 递归下降分析法 58
3.4 LL(1)分析法 60
3.4.1 非递归预测分析器 60
3.4.2 构造预测分析表 62
3.5 预测分析中的错误处理 63
3.6 小结 64
复习思考题 64
第4章 自底向上语法分析 66
4.1 自底向上分析的基本概念 66
4.1.1 归约 66
4.1.2 句柄 67
4.1.3 用栈实现自底向上分析 68
4.1.4 移进-归约分析的冲突 69
4.2 算符优先分析 70
4.2.1 直观算符优先分析法 71
4.2.2 算符优先文法的定义 73
4.2.3 算符优先关系表的构造 74
4.2.4 算符优先分析算法 75
4.2.5 优先函数 76
4.2.6 算符优先分析法的局限性 78
4.3 LR分析法 78
4.3.1 LR分析算法 79
4.3.2 LR文法和LR分析方法的特点 81
4.3.3 构造LR(0)分析表 82
4.3.4 构造SLR(1)分析表 88
4.3.5 构造规范的LR分析表 92
4.3.6 构造LALR分析表 95
4.3.7 二义文法的应用 97
4.4 语法分析程序的自动生成工具YACC 101
4.5 实例语言编译程序的语法分析 104
4.6 小结 106
复习思考题 107
第5章 语义分析与中间代码的生成 110
5.1 语义分析的任务 110
5.1.1 语义分析的概念 110
5.1.2 语义分析的任务 111
5.2 语法制导翻译 111
5.2.1 属性文法 111
5.2.2 语法制导翻译方法 111
5.3 中间代码 112
5.3.1 逆波兰表示法 112
5.3.2 四元式 112
5.3.3 三元式 113
5.3.4 间接三元式 113
5.3.5 抽象语法树 114
5.4 说明语句的翻译 114
5.4.1 简单说明语句的翻译 114
5.4.2 过程中的说明 115
5.5 赋值语句的翻译 115
5.5.1 简单算术表达式和赋值语句的翻译 115
5.5.2 数组的翻译 117
5.6 布尔表达式的翻译 117
5.7 控制语句的翻译 120
5.7.1 条件语句if的翻译 121
5.7.2 循环语句while的翻译 122
5.7.3 三种基本控制结构的翻译 123
5.8 过程调用的翻译 124
5.9 实例编译程序的语义分析 125
5.10 小结 127
复习思考题 127
第6章 符号表管理 131
6.1 符号表的作用 131
6.1.1 收集标识符属性信息 131
6.1.2 符号表内容为上下文语义的合法性检查提供依据 132
6.1.3 作为目标代码生成阶段编译程序分配地址空间的依据 132
6.2 符号表的主要内容 132
6.2.1 符号名 132
6.2.2 符号的类型 133
6.2.3 符号的存储类型 133
6.2.4 符号的作用域及可视性 133
6.2.5 符号变量的存储分配信息 134
6.2.6 符号的其他属性 136
6.3 符号表的组织 136
6.3.1 符号表的总体组织 136
6.3.2 符号表项的组织 138
6.4 符号表的管理 142
6.4.1 符号表的初始化 142
6.4.2 符号的插入 143
6.4.3 符号的查找 145
6.5 小结 146
复习思考题 146
第7章 运行时的存储组织与分配 147
7.1 存储组织概述 147
7.1.1 运行时内存的划分 147
7.1.2 过程活动记录 149
7.2 静态存储分配 150
7.3 栈式动态存储分配 151
7.3.1 栈的结构 151
7.3.2 活动树和简单的栈式存储分配 151
7.3.3 嵌套过程语言的栈式实现 153
7.4 堆式动态存储分配 154
7.5 小结 156
复习思考题 156
第8章 代码优化 158
8.1 局部优化 159
8.1.1 基本块的划分 159
8.1.2 利用基本块DAG进行优化 162
8.2 循环优化 166
8.2.1 程序流图 166
8.2.2 循环的查找 167
8.2.3 循环优化 169
8.3 小结 171
复习思考题 171
第9章 目标代码生成 173
9.1 目标代码的形式 173
9.2 假想的计算机模型 174
9.3 一个简单的代码生成程序 175
9.3.1 待用信息和活跃信息 175
9.3.2 寄存器描述和地址描述 175
9.3.3 代码生成算法 176
9.3.4 寄存器选择函数 177
9.3.5 为变址和指针语句产生代码 178
9.3.6 条件语句 178
9.4 小结 180
复习思考题 180
附录A C语言实现的实例语言编译程序 181
附录B YACC语言实现的实例语言编译程序 184
参考文献 185
展开
编译技术是计算语言发展的支柱,也是计算机科学中发展最迅速、最成熟的一个分支。“编译原理”是一门研究设计和构造编译程序的原理和方法的课程,是计算机及其相关专业的一门核心课程,在教学中占有极其重要的地位。该课程蕴涵着计算机学科中解决问题的思路、形式化问题和解决问题的方法。编译程序是计算机系统软件的重要组成部分,其基本原理和实现技术也适用于一般软件的设计和实现,因此对应用软件和系统软件的设计与开发有一定的启发和重要的指导作用,在软件工程、软件自动化、语言转换、程序分析及其他领域具有广泛的应用。本书主要介绍设计和构造编译程序的一般原理、基本方法和主要实现技术。通过该课程的学习,使学生掌握编译系统的结构、工作流程及编译程序各组成部分的设计原理和常用的编译技术及方法,为今后从事应用软件和系统软件的开发奠定一定的理论和实践基础。
本书共分9章。第1章介绍了编译程序的基础知识,包括编译工作的基本过程及各阶段的基本任务;第2章介绍了文法及语言的基本概念、文法分类、词法分析程序的设计原理与构造方法等;第3章介绍了自顶向下语法分析的基本思想和分析技术,包括语法分析的任务、LL(1)文法、LL(1)分析法和递归下降分析法;第4章介绍了自底向上语法分析的基本思想和分析技术,包括算符优先分析、LR分析法等;第5章介绍了语义分析与中间代码的生成;第6章介绍了符号表的组织与管理,包括符号表的作用、符号表的组织和使用方法;第7章介绍了运行时的存储组织与分配技术;第8章介绍了代码优化的基本概念、基本块的划分、局部优化和循环优化方法等;第9章介绍了目标代码生成的基本技术。
本书系统性强,概念清晰,内容简明通俗,每章章首配有本章的学习目标和学习要求,章末配有本章小结和适量的习题,可使学习者快速掌握书中的内容。本书附录中的程序代码可扫相应的二维码查看,或者登录华信教育资源网www.hxedu.com.cn注册后下载。
本书根据作者多年的教学经验编写而成,在成书的过程中,编著参考了书末所列出的有关文献,在此,向这些书籍的作者一并表示感谢。由于编著者水平有限,时间仓促,书中难免存在一些缺点和不足,敬请读者多提宝贵意见,以便再做修订补充。
编著者
展开