什么是回补?

在为给定的表达式生成三个地址代码时,它可以在 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(p 1 ,p 2 ) - 连接 p 1和 p 2指向的列表,并返回一个指向连接列表的指针。

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

布尔表达式的回补

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

B → B 1 | | MB 2 |B 1 && MB 2 |!B 1 |(B 1 )|E 1 rel E 2 |真|假

M → ϵ

控制语句流

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

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

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

以上是 什么是回补? 的全部内容, 来源链接: utcz.com/z/352621.html

回到顶部