回填
# 回填
# 回填的基本思想
- 生成一个跳转指令时,暂时不指定该跳转指令的目标标号
- 这样的指令都被放入由跳转指令组成的列表中
- 同一个列表中的所有跳转指令具有相同的目标标号
- 等到能够确定正确的目标标号时,才去填充这些指令的目标标号
相关函数
makelist(i)
merge(p1, p2)
backpatch(p, i)
nextquad
- 下一条指令的编号
# 布尔表达式的回填
对于非终结符 B 添加综合属性
B.truelist
B.falselist
修改相关的布尔表达式的 SDT
示例中
and
优先级较高,对应于移入操作回填即是填入标号
示例
- 图中
t
和f
对应的标号由后续语句确定
布尔表达式回填的翻译方案
点击查看
# 控制流语句的回填
添加综合属性
S.nextlist
- 指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是按照运行顺序紧跟在
代码之后的指令的标号
- 指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是按照运行顺序紧跟在
是为了记录 第一条指令的标号 if-then-else
产生式是为了在 else
前产生goto
语句- 防止控制流"穿越"
代码的底部 是一条赋值语句时,就会发生这种情况
控制流语句回填的翻译方案
点击查看
示例
while a < b do
if c < 5 then
while x > y do z = x + 1;
else
x = y;
1
2
3
4
5
2
3
4
5
- 翻译参照龙书 图 6-43(P264) 和 图 6-46(P267)
编辑 (opens new window)