zhouqijie

回填

生成布尔表达式和控制流语句的目标代码时,关键问题之一就是将一个跳转指令和该指令目标匹配起来。比如要确定条件语句中条件为false时跳转指令goto的目标。

  1. 上一节中的解决方案是将标号作为继承属性传递到生成跳转指令的地方,但是这样做的需要两趟处理,将标号和具体地址绑定起来。
  2. 本节介绍一种称为回填(backpatching)的补充技术,它把一个由跳转指令组成的列表以综合属性的形式进行传递。

明确地讲,生成一个跳转指令时暂时不指定该跳转指令的目标。这样的指令都放入一个由跳转指令组成的列表中。等到真正能够确定正确的目标标号时才去填充这些指令的目标标号。同一个列表中的所有跳转指令具有相同的标号。

CRE:回填通常会使用一个标记非终结符M,它的作用是在适当时刻获取将要生成的下一条指令的下标。比如S-> while M1 (B) M2 S1中标记M的两次出现分别记录了B的代码和S1的代码开始处标号。

GPT:可以不引入新的标记非终结符也可以实现回填。第一种替代方法是使用数据结构存储待回填位置。第二种方法是利用语法和语义动作本身。

(详见《编译原理》p263-269)

(END)