文案说明readmedecafpa3自述.pdf
DecafPA3说明
任务描述
在PA2中,我们已经完成了对输入程序的语义分析工作,此时的输入程序必定是有明
确的语义而且不具有不符合语言规范的语义错误的,在接下来的PA3中,对该输入
程序进行翻译,把使用带属性修饰的抽象语法树(decoratedAST)来表示的输入程序翻
译成适合后期处理的另一种中间表示方式。
一般来说,把程序翻译为AST以外的中间表示方式是各种编译器前端的最后一步工作,
这步工作以后编译过程便进入了中端处理或者直接进入后端处理部分。为了便于翻译工作的
进行,在实际的编译过程中往往需要反复地从一种中间表示变为另一种中间表示,直到变换
成最终的汇编代码或者机器代码为止,其中后一种中间表示总是更加适合后面所需要进行的
分析和处理。有的时候为了更好地分析程序的需要中间表示之间的变换次数是非常多的,例
如GCC4的编译过程除AST以外还有GENERIC、GIMPLE、RTL几种中间表示;而
ORC/Open64的编译过程除AST以外还有多达九种的中间表示。
在Decaf编译器中,为简单起见,我们在AST以外只涉及一种中间表示,这种中间表
示叫做三地址码(ThreeAddressCode,TAC),是一种比较接近汇编语言的表示方式。
PA3中我们需要把AST表示的程序翻译为跟它在语义上等价的TAC中间表示,并在合适的
地方加入诸如检查数组越界、数组大小等运行时错误的内容。在TAC表示的基础
上,经过临时变量的活性分析(PA4内容)、生成汇编代码(在PA4中直接提供)以后,整
个编译过程便告完成。
通过这个阶段,希望大家能在语法制导处理的基础上进一步掌握语法制导的中间代码翻
译方法,并且对过程调用协定、面向对象机制的实现方法、布局等内容有所了解。
本阶段涉及的类和工具说明
文件/类含义说明
translate/Translater翻译工作的辅助类根据需要修改
translate/TransPass1第一趟扫描根据需要修改
translate/TransPass2第二趟扫描根据需要修改
tac/*TAC语句不需要修改
你要用PA1-A中修改过的
frontend/*编译器最前端文件覆盖下相应的文
件
你要用PA2中修改过的文
typecheck/*语义分
件覆盖下相应的文件
scope/*作用域定义不需要修改
symbol/*符号定义不需要修改
type/*类型定义不需要修改
你要将前两个阶段中修改
tree/*抽象语法树的各种结点
过的部分过来
根据需要增加运行时错误
er