图书介绍
编译器构造PDF|Epub|txt|kindle电子书版本网盘下载
![编译器构造](https://www.shukui.net/cover/45/33823770.jpg)
- (美)费希尔,(美)赛特朗,(美)莱比兰克著;郭耀等译 著
- 出版社: 北京:清华大学出版社
- ISBN:9787302281047
- 出版时间:2012
- 标注页数:445页
- 文件大小:126MB
- 文件页数:469页
- 主题词:编译器-教材
PDF下载
下载说明
编译器构造PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第1章 概述1
1.1 编译的历史1
1.2 编译器可以做什么3
1.2.1 编译器生成的机器代码3
1.2.2 目标代码格式5
1.3 解释器6
1.4 语法和语义7
1.4.1 静态语义8
1.4.2 运行时语义8
1.5 编译器的组织结构10
1.5.1 扫描器11
1.5.2 分析器12
1.5.3 类型检查器(语义分析)12
1.5.4 翻译器(程序综合)12
1.5.5 符号表13
1.5.6 优化器13
1.5.7 代码生成器13
1.5.8 编译器开发工具14
1.6 程序设计语言和编译器设计14
1.7 计算机体系结构和编译器设计15
1.8 编译器设计的考虑事项16
1.8.1 调试(开发)编译器16
1.8.2 优化编译器17
1.8.3 可重定向编译器17
1.9 集成开发环境18
练习18
第2章 一个简单的编译器21
2.1 ac语言的非形式化定义21
2.2 ac语言的形式化定义22
2.2.1 语法规范22
2.2.2 词法单元规范24
2.3 一个简单编译器中的阶段25
2.4 扫描25
2.5 分析27
2.5.1 分析过程的预测27
2.5.2 产生式的实现28
2.6 抽象语法树29
2.7 语义分析31
2.7.1 符号表31
2.7.2 类型检查32
2.8 代码生成34
练习36
第3章 扫描——理论和实践38
3.1 扫描器概述38
3.2 正则表达式40
3.3 示例42
3.4 有限自动机和扫描器43
3.4.1 确定性的有限自动机44
3.5 扫描器生成工具Lex46
3.5.1 定义Lex中的词法单元47
3.5.2 字符类48
3.5.3 使用正则表达式来定义词法单元49
3.5.4 使用Lex进行字符处理51
3.6 其他扫描器生成工具53
3.7 构造扫描器的实际注意事项53
3.7.1 处理标识符和字面常量54
3.7.2 使用编译命令和列出源码行57
3.7.3 扫描器的终止58
3.7.4 向前看多个字符58
3.7.5 性能上的考虑60
3.7.6 词法错误恢复61
3.8 正则表达式和有限自动机63
3.8.1 把正则表达式转换为NFA64
3.8.2 创建DFA64
3.8.3 有限状态机的化简66
3.8.4 把有限自动机转换为正则表达式68
3.9 本章小结71
练习72
第4章 文法和分析77
4.1 上下文无关文法77
4.1.1 最左推导79
4.1.2 最右推导79
4.1.3 分析树80
4.1.4 其他类型的文法81
4.2 上下文无关文法的属性81
4.2.1 简化的文法82
4.2.2 二义性82
4.2.3 语言定义中的错误83
4.3 扩展文法的转换83
4.4 分析器和识别器84
4.5 文法分析的算法86
4.5.1 文法表示87
4.5.2 推导空字符串88
4.5.3 First集合89
4.5.4 Follow集合92
练习94
第5章 自顶向下分析98
5.1 概述98
5.2 LL(k)文法99
5.3 递归下降的LL(l)分析器102
5.4 表格驱动的LL(l)分析器103
5.5 如何获得LL(l)文法105
5.5.1 公共前缀106
5.5.2 左递归106
5.6 非LL(l)的语言107
5.7 LL(l)分析器的属性109
5.8 分析表的表示方法110
5.8.1 精简方法111
5.8.2 压缩方法112
5.9 语法错误的恢复和修复114
5.9.1 错误恢复114
5.9.2 错误修复115
5.9.3 LL(l)分析器中的错误检查115
5.9.4 LL(l)分析器中的错误恢复116
练习117
第6章 自底向上分析121
6.1 概述121
6.2 移进—规约分析器122
6.2.1 LR分析器和最右推导123
6.2.2 把LR分析看做是编织过程(knitting)123
6.2.3 LR分析引擎125
6.2.4 LR分析表125
6.2.5 LR(k)分析128
6.3 LR(0)分析表的构造129
6.4 冲突诊断133
6.4.1 二义性文法135
6.4.2 非LR(k)的文法137
6.5 冲突解决方法和分析表的构造138
6.5.1 SLR(k)分析表的构造138
6.5.2 LALR(k)分析表的构造141
6.5.3 LALR传播图143
6.5.4 LR(k)分析表的构造147
本章小结151
练习151
第7章 语法制导翻译158
7.1 概述158
7.1.1 语义动作和语义值158
7.1.2 综合和继承属性159
7.2 自底向上的语法制导翻译160
7.2.1 示例161
7.2.2 规则克隆163
7.2.3 强加语义动作164
7.2.4 进一步的文法重组164
7.3 自顶向下的语法制导翻译166
7.4 抽象语法树168
7.4.1 具体和抽象语法树168
7.4.2 高效的抽象语法树数据结构168
7.4.3 创建抽象语法树的基础结构169
7.5 抽象语法树的设计和构造171
7.5.1 设计171
7.5.2 构造173
7.6 左值和右值的抽象语法树结构175
7.7 抽象语法树的设计模式177
7.7.1 结点的类层次结构177
7.7.2 访问者模式178
7.7.3 反射的访问者模式179
本章小结182
练习182
第8章 符号表和声明处理186
8.1 构造符号表186
8.1.1 静态作用域187
8.1.2 符号表的接口188
8.2 块结构的语言和作用域189
8.2.1 处理作用域189
8.2.2 使用一个还是多个符号表190
8.3 基本的实现技术191
8.3.1 添加和查找名称191
8.3.2 名字空间193
8.3.3 一种高效的符号表实现方法194
8.4 高级特性196
8.4.1 记录和类型名196
8.4.2 重载和类型层次结构197
8.4.3 隐式声明198
8.4.4 导出和导入命令198
8.4.5 查找规则的修改199
8.5 声明处理的基础199
8.5.1 符号表中的属性199
8.5.2 类型描述符的结构200
8.5.3 使用抽象语法树进行类型检查201
8.6 变量和类型声明203
8.6.1 简单变量声明203
8.6.2 类型名称的处理204
8.6.3 类型声明204
8.6.4 复杂的变量声明207
8.6.5 静态数组类型208
8.6.6 结构和记录类型209
8.6.7 枚举类型210
8.7 类和方法的声明212
8.7.1 类声明的处理213
8.7.2 方法声明的处理215
8.8 类型检查简介217
8.8.1 简单标识符和字面常量219
8.8.2 赋值语句220
8.8.3 表达式检查220
8.8.4 复杂名称的检查221
本章小结224
练习225
第9章 语义分析229
9.1 控制结构的语义分析229
9.1.1 可达和终止分析231
9.1.2 if语句232
9.1.3 While、Do和Repeat循环234
9.1.4 for循环236
9.1.5 break、continue、return和goto语句238
9.1.6 switch和case语句243
9.1.7 异常处理246
9.2 方法调用的语义分析251
9.3 本章小结256
练习256
第10章 中间表示形式261
10.1 概述261
10.1.1 示例262
10.1.2 中端263
10.2 Java虚拟机265
10.2.1 概述和设计原则265
10.2.2 类文件的内容266
10.2.3 JVM指令267
10.3 静态单赋值形式275
10.3.1 重命名和?-函数276
练习277
第11章 面向虚拟机的代码生成279
11.1 代码生成的Visitor279
11.2 类和方法声明280
11.2.1 类声明282
11.2.2 方法声明283
11.3 MethodBodyVisitor284
11.3.1 常量284
11.3.2 局部存储的引用284
11.3.3 静态引用285
11.3.4 表达式285
11.3.5 赋值286
11.3.6 方法调用287
11.3.7 域引用289
11.3.8 数组引用290
11.3.9 条件执行290
11.3.10 循环291
11.4 LHS Visitor292
11.4.1 局部引用293
11.4.2 静态引用293
11.4.3 域引用293
11.4.4 数组引用294
练习295
第12章 运行时支持298
12.1 静态分配298
12.2 栈分配299
12.2.1 类和struct中的域访问300
12.2.2 在运行时访问活动记录301
12.2.3 处理类和对象302
12.2.4 处理多个作用域303
12.2.5 程序块级的分配305
12.2.6 关于活动记录的其他内容306
12.3 数组309
12.3.1 静态的一维数组309
12.3.2 多维数组313
12.4 堆管理315
12.4.1 分配机制315
12.4.2 释放机制317
12.4.3 自动垃圾回收318
12.5 基于区域的内存管理323
练习324
第13章 目标代码生成330
13.1 字节码的翻译331
13.1.1 内存地址的分配332
13.1.2 数组和对象的分配333
13.1.3 方法调用335
13.1.4 字节码翻译的例子337
13.2 表达式树的翻译338
13.3 寄存器分配342
13.3.1 On-the-Fly寄存器分配342
13.3.2 使用图着色法的寄存器分配344
13.3.3 基于优先级的寄存器分配349
13.3.4 过程间寄存器分配350
13.4 代码调度351
13.4.1 代码调度的改进354
13.4.2 全局和动态的代码调度355
13.5 自动的指令选择356
13.5.1 使用BURS进行指令选择358
13.5.2 使用Twig进行指令选择359
13.5.3 其他方法360
13.6 窥孔优化361
13.6.1 窥孔优化的层次361
13.6.2 窥孔优化的自动生成364
练习364
第14章 程序优化370
14.1 概述370
14.1.1 为什么要进行优化371
14.2 控制流分析375
14.2.1 控制流图376
14.2.2 程序和控制流结构378
14.2.3 直接过程调用图378
14.2.4 深度优先生成树379
14.2.5 支配关系382
14.2.6 简单的支配算法383
14.2.7 快速的支配算法385
14.2.8 支配边界393
14.2.9 区间395
14.3 数据流分析简介403
14.3.1 可用表达式404
14.3.2 活跃变量406
14.4 数据流框架407
14.4.1 数据流求值图408
14.4.2 交格409
14.4.3 转换函数411
14.5 求值412
14.5.1 迭代412
14.5.2 初始化414
14.5.3 终止问题和快速框架415
14.5.4 分配式框架418
14.6 常量传播419
14.7 SSA形式422
14.7.1 添加?-函数424
14.7.2 重命名424
练习427
参考文献436
缩略语443