首页 文章资讯内容详情

什么是回补?

2026-06-02 2 花语

在为给定的表达式生成三个地址代码时,它可以在goto语句中指定Label的地址。在一次传递中分配这些标签语句的位置非常困难,因此使用了两次传递。在第一遍中,它可以不指定这些地址,并在下一遍中填充这些地址。因此填充不完全变换称为Backpatching。

使用backpatching一次性生成代码

Backpatching可用于一次性生成布尔表达式和控制语句流的程序。其中,非终结符B的合成属性truelist和falselist用于处理布尔表达式跳转代码中的标签。

具体来说,B.truelist将是一个跳转或条件跳转指令的列表,如果B为真,它应该添加控制去的标签。B.falselist类似的还有指令列表,当B为假时,最终得到控制去的标签。

由于程序是为B生成的,因此跳转到true和false存在不完整,标签字段未填充。这些初步跳转位于由B.truelist和B.falselist适用时指向的列表中。

深入探索
编程语言
编程

同样,语句S有一个综合属性S.nextlist,表示直接跳转到S的代码之后的指令的列表。它可以将指令生成到指令数组中,标签将作为该数组的索引。为了操作跳转列表,我们使用三个函数-

Makelist(i)-创建一个仅包含i的新列表,这是指令数组的索引;makelist返回一个指向新生成列表的指针。

Merge(p1,p2)-连接p1和p2指向的列表,并返回一个指向连接列表的指针。

Backpatch(p,i)-插入i作为p指向的记录上每条指令的目标标签。

布尔表达式的回补

它可以创建适合在自底向上解析期间为布尔表达式生成代码的翻译方案。语法中的非终结符M生成语义动作以在合适的时间选取要创建的下一条指令的索引。语法如下-

B→B1||MB2|B1&&MB2|!B1|(B1)|E1relE2|真|假

M→ϵ

控制语句流

控制语句是改变语句执行流程的语句。例如,If、If-else、Switch-Case、while-do语句。在编程语言中,布尔表达式经常用于

编程

改变控制流-布尔表达式用作改变控制流的语句中的条件表达式。这种布尔表达式的值隐含在程序中到达的位置。例如,如果(E)S,如果到达语句S,则表达式E必须为真。

计算逻辑值-布尔表达式可以描述真值或假值。可以使用带有逻辑运算符的三个地址指令与算术表达式并行计算此类布尔表达式。