第1章 概述 1
1.1 本书的研制背景与目标 1
1.2 本书课程实验的构成 2
1.2.1 要实现的源语言 2
1.2.2 目标机的选择 3
1.2.3 中间表示 4
1.2.4 汇编代码的内部表示 5
1.2.5 编译器组件及本书的课程实验概览 6
1.3 开发环境与工具 8
1.3.1 开发环境与工具简介 8
1.3.2 环境变量设置 10
1.3.3 Eclipse的安装和使用 12
1.3.4 XML与Ant简介 21
1.4 实验软件包 25
1.5 课程实验开展建议 27
1.5.1 测试环境 27
1.5.2 课程设计提交要求 28
1.5.3 过程管理与控制 29
第2章 一个简单的程序解释器 30
2.1 SimpleMiniJOOL语言 30
2.2 课程设计1:一个简单的程序解释器 32
2.3 实验运行平台 33
2.3.1 实验平台接口 34
2.3.2 实验运行平台的工作机制 37
2.3.3 实验运行平台的使用 39
2.4 Eclipse AST 46
2.4.1 AST节点类 47
2.4.2 AST类 48
2.4.3 ASTVisitor类 48
2.4.4 SimpleMiniJOOL语言涉及的AST节点类 50
2.4.5 Eclipse AST使用示例 56
2.5 AST的图形化显示包——ASTView 57
2.5.1 ASTView包中的类 57
2.5.2 AST节点的输出属性及其定制 59
2.5.3 在ASTViewer中显示节点对应的低级中间表示 60
2.6 设计模式 60
2.6.1 工厂方法模式 61
2.6.2 访问者模式 61
2.7 课程设计1开发和测试指南 63
2.7.1 主要开发任务 63
2.7.2 实现InterpVisitor类的一些指导 64
2.7.3 在Eclipse下开发 65
2.7.4 在控制台下编译和运行 67
2.7.5 测试要求 70
第3章 词法分析 71
3.1 本章课程设计概述 71
3.2 MiniJOOL语言的词法 73
3.3 课程设计2-1:用JFlex为MiniJOOL语言生成一个词法分析器 74
3.3.1 示例 74
3.3.2 MiniJOOL语言的词法分析器构造 81
3.4 课程设计2-2:手工编写一个简单的词法分析器 82
3.4.1 Block语言的词法 82
3.4.2 示例 82
3.4.3 课程设计任务 85
3.4.4 编译和运行指南 86
3.5 课程设计2-3:编写一个NFA生成器 88
3.5.1 MLex词法规范描述语言 89
3.5.2 课程设计指导 90
3.5.3 课程设计任务 95
3.6 课程设计2-4:编写一个词法分析器的生成器 96
3.6.1 LexerCodeGenerator的输入和输出示例 96
3.6.2 课程设计指导 98
3.7 JFlex词法规范 99
3.7.1 用户代码 99
3.7.2 选项和声明 99
3.7.3 词法规则 102
3.7.4 如何匹配输入流 106
第4章 语法分析 107
4.1 SkipOOMiniJOOL语言的语法 107
4.1.1 类型、常量和变量 107
4.1.2 语句 113
4.1.3 表达式 114
4.1.4 SkipOOMiniJOOL程序的总体结构 116
4.1.5 一个SkipOOMiniJOOL程序示例 117
4.2 本章课程设计概述 119
4.3 课程设计3-1:手工编写一个语法分析器 121
4.3.1 SimpleBlock语言 121
4.3.2 如何引用课程设计2-2的词法分析器类 122
4.3.3 课程设计指导 123
4.3.4 课程设计任务 127
4.4 课程设计3-2:用CUP生成一个能分析合法程序的语法分析器 127
4.4.1 示例1:SimpleBlock语言的语法分析器 128
4.4.2 SkipOOMiniJOOL语言涉及的AST节点类 141
4.4.3 示例2:Block语言的语法分析器 145
4.4.4 课程设计任务 150
4.5 课程设计3-3:用JavaCC生成一个语法分析器 151
4.5.1 示例:Block语言及其子语言的分析器 151
4.5.2 课程设计任务 162
4.6 课程设计3-4:用CUP生成一个有错误处理能力的语法分析器 162
4.6.1 错误类型与错误信息管理 163
4.6.2 错误恢复与处理机制 166
4.6.3 示例 168
4.6.4 课程设计任务 169
4.7 课程设计3-5:用JavaCC生成一个有错误处理能力的语法分析器 169
4.7.1 JavaCC的错误恢复机制 170
4.7.2 错误恢复与处理示例 171
4.7.3 课程设计任务 173
4.8 CUP与YACC 174
4.8.1 YACC简介 174
4.8.2 CUP与YACC的文法规范描述文件的结构 175
4.8.3 文法符号 175
4.8.4 一个简单的例子 177
4.8.5 错误恢复 178
第5章 语义分析 179
5.1 SkipOOMiniJOOL语言的静态语义 179
5.1.1 非形式描述部分 179
5.1.2 形式描述部分:类型系统 184
5.2 本章课程设计概述 194
5.3 课程设计4-1至课程设计4-3特征概述 195
5.4 课程设计4-1:为源程序对应的AST构造符号表 197
5.4.1 Block语言的语义特征 197
5.4.2 示例:为Block程序对应的AST构造符号表 198
5.4.3 课程设计指导和任务 202
5.5 课程设计4-2:利用AST及其符号表信息开展语义检查 204
5.5.1 示例:利用Block程序对应的AST及其符号表信息开展语义检查 204
5.5.2 课程设计指导与任务 207
5.6 课程设计4-3:对源程序关联的AST进行语义检查 208
5.6.1 示例:对Block程序对应的AST进行语义检查 208
5.6.2 课程设计注意事项 210
5.7 课程设计4-4:在语法分析的同时构造符号表 210
5.7.1 课程设计4-4和课程设计4-5关联的文件 210
5.7.2 示例:带符号表构造的Block语言分析器 211
5.7.3 课程设计任务 214
5.8 课程设计4-5:在语法分析的同时开展语义检查 214
5.8.1 示例:带语义检查的Block语言分析器 214
5.8.2 课程设计要点 216
第6章 中间表示的转换 217
6.1 本章课程设计概述 217
6.2 低级中间表示LIR 218
6.2.1 LIR设计特点简介 220
6.2.2 LIR类型 225
6.2.3 LIR操作数 227
6.2.4 LIR语句 231
6.3 课程设计5-1:SkipOOMiniJOOL语言的AST到LIR的转换器 233
6.3.1 课程设计指导 233
6.3.2 课程设计任务 237
6.4 课程设计5-2和课程设计5-3 238
第7章 汇编语言及汇编代码的内部表示 239
7.1 汇编语言简介 239
7.2 MIPS汇编语言 240
7.2.1 五阶段流水以及流水可见性 240
7.2.2 数据表示与对齐 241
7.2.3 寄存器 242
7.2.4 地址空间 242
7.2.5 寻址方式 243
7.2.6 过程调用约定 243
7.2.7 伪指令 245
7.2.8 常用MIPS汇编指令 246
7.3 x86汇编语言 250
7.3.1 处理器执行周期和数据表示 250
7.3.2 寄存器 251
7.3.3 地址空间 253
7.3.4 寻址方式 254
7.3.5 过程调用 255
7.3.6 AT&T汇编语法与Intel汇编语法的区别 258
7.3.7 伪指令 259
7.3.8 常用x86汇编指令 260
7.4 汇编代码的内部表示 264
7.4.1 AIR库的组成及设计特点 265
7.4.2 使用AIR库编程的步骤 266
7.4.3 配置文件格式及示例 267
7.4.4 符号编码类的代码生成 269
7.4.5 汇编代码的表示、创建与输出 270
第8章 汇编代码生成 275
8.1 本章课程设计概述 275
8.2 汇编代码生成器设计中的问题 276
8.3 汇编代码生成器的开发步骤 278
8.4 edu.ustc.cs.compile.lir.opt包及其使用 280
8.4.1 edu.ustc.cs.compile.opt.base包:抽象层 280
8.4.2 edu.ustc.cs.compile.opt.lir包:LIR实现层 288
8.5 寄存器分配 290
8.5.1 线性扫描寄存器分配算法 291
8.5.2 实验软件包中的寄存器分配器 291
8.6 汇编代码生成的代码框架 293
8.6.1 基于LIR流图结构的汇编代码生成 293
8.6.2 AST到汇编代码的生成 295
8.7 MIPS汇编代码的生成与执行 295
8.7.1 MIPS汇编语言与SkipOOMiniJOOL语言中部分结构的对应关系 295
8.7.2 利用SPIM解释执行MIPS汇编代码 298
8.8 x86汇编代码的生成与执行 299
8.8.1 LIR语句的转换 299
8.8.2 x86汇编代码的生成 300
第9章 面向对象语言的编译 302
9.1 MiniJOOL语言特征 303
9.1.1 一个MiniJOOL程序示例 303
9.1.2 MiniJOOL程序的总体结构 304
9.1.3 类类型及其使用 308
9.2 本章课程设计概述 310
9.3 课程设计8-1:构造MiniJOOL语言的词法语法分析器 312
9.4 课程设计8-2:构造MiniJOOL语言的语义检查器 313
9.5 面向MiniJOOL语言的LIR 314
9.5.1 对面向对象特征及其处理的设计考虑 314
9.5.2 LIR中的类对象存储布局和类的类型信息表示 316
9.5.3 LIR中虚方法表结构以及运行时类型判断 320
9.6 课程设计8-3:构造MiniJOOL-Ⅰ语言的AST到LIR的转换器 321
9.6.1 课程设计指导 321
9.6.2 课程设计任务 323
9.7 课程设计8-4:构造MiniJOOL-Ⅱ语言的AST到LIR的转换器 323
9.8 课程设计8-5:构造MiniJOOL-Ⅲ语言的AST到LIR的转换器 324
9.9 课程设计8-6:构造MiniJOOL语言的AST到LIR的转换器 325
9.10 课程设计8-7:构造MiniJOOL语言的汇编代码生成器 326
9.10.1 课程设计指导 326
9.10.2 课程设计任务 327
第10章 综合性课程设计 328
10.1 课程设计内容 328
10.1.1 可选的编译器组件 328
10.1.2 各编译器组件的组合方式 331
10.2 课程设计实施方法 332
10.3 答辩与考评要求 333
附录 335
附录1 MiniJOOL语言的词法记号类型及标识 335
附录2 运算符的优先级与结合性 336
附录3 MLex词法规范语言的EBNF表示 336
附录4 SimpleMiniJOOL语言语法的EBNF表示 337
附录5 SkipOOMiniJOOL语言语法的EBNF表示 338
附录6 MiniJOOL语言语法的EBNF表示 339
附录7 与本书有关的Eclipse AST节点类及其含义 341
附录8 MIPS-SPIM汇编语言的EBNF定义 343
附录9 采用AT&T语法的x86汇编语言的EBNF定义 344
附录10 实验软件包提供的可用编译器组件 345
参考文献 346