stage-3
郭高旭 ggx21@mails.tsinghua.edu.cn 2021010803
实验内容
增加块语句的支持。
前端
主要是修改了重复声明的检查。只有在同一个作用域里,变量才不能重复声明
具体而言,定义了ScopeStack替换原有的单一scope,重新实现lookup,declare,使得它们仅仅在当前ScopeStack的栈顶生效
-
lookupCurrent:在Declaration时,只在当前(栈顶)查找符号表
-
lookup:在visitIdentifier等中,从栈顶反向查找,直至查找到声明或者失败,这样保证查找到最近的声明
-
declare:在栈顶scope(当前scope)scope
-
namer语义检查时的visitBlock中,新作用域入栈,访问结束后,此作用域出栈
中端
本步骤中无须新增新的 TAC 指令。
后端
数据流分析:新增了判断基本块是否可达的代码,为每一个BasicBlock添加reachable属性,通过dfs找到所有可达块,并更新reachable
在寄存器分配函数bruteregalloc.py
中 ,仅仅为可达的基本块分配寄存器.
1 | for bb in graph.iterator(): |
思考题
请画出下面 MiniDecaf 代码的控制流图。
1 | int main(){ |
由于控制流图是根据TACinstr构造的,所以这里先给出上述代码的TAC表示(bb为含注释行到上一注释行后)
1 | FUNCTION<main>: |
则上述4个基本块构造的控制流图如下
graph TD A[bb1]-->B[bb2] A[bb1]-->C[bb4] D[bb3:不可达]