gpt4 book ai didi

language-agnostic - 回补如何与标记一起使用?

转载 作者:行者123 更新时间:2023-12-04 07:48:33 24 4
gpt4 key购买 nike

我在整个 Internet 上进行了搜索,但找不到关于回补如何工作的正确解释?

你能解释一下回补是如何工作的吗?它如何与标记一起使用?

我知道它有两种主要类型的标记:

  1. 其中包含下一个四边形
  2. 其中包含下一个列表

我找到了 this code ,他们在其中获取输入文件并使用 RISKI 语言创建文件。

在他们的第一卷中,他们有:

PROGRAM : N FUNCTION M MAIN_FUNCTION

您可以看到 N 和 M 是标记(它们是空卷)。

最佳答案

一次性代码生成在生成条件代码方面存在一个小问题。一个典型的if语句:

if CONDITION then ALTERNATIVE_1 else ALTERNATIVE_2

需要编译成这样的:

  compute CONDITION
JUMP_IF_TRUE label1
JUMP_IF_FALSE label2

label1:
code for ALTERNATIVE_1
JUMP label3

label2:
code for ALTERNATIVE_2
JUMP label3

label3:
next statement

但是在生成CONDITION的代码时,不知道label1label2在哪里, code>ALTERNATIVE_1ALTERNATIVE_2 正在生成,不知道 label3 在哪里。

这样做的一种方法是对标签使用符号名称,如上面的伪代码中所示,并在已知值时填写实际值。这需要在跳转语句中存储一个符号名称,这会使数据结构复杂化(特别是,您不能只使用二进制汇编代码)。它还需要第二遍,只是为了填写跳跃目标。

一种(可能)更简单的方法是只记住跳转语句的地址,并在目标地址已知时修补它。这称为“backpatching”,因为您返回并修补生成的代码。

事实证明,在许多情况下,您最终会得到多个分支到同一个标签。一个典型的例子是像 C 系列的 &&|| 运算符这样的“短路” bool 值。例如,扩展原来的例子:

if (CONDITION_1 and CONDITION_2) or CONDITION_3 then ALTERNATIVE_1 else ALTERNATIVE_2

compute CONDITION_1
JUMP_IF_TRUE label1
JUMP_IF_FALSE label2

label1:
compute CONDITION_2
JUMP_IF_TRUE label3
JUMP_IF_FALSE label2

label2:
compute CONDITION_3
JUMP_IF_TRUE label3
JUMP_IF_FALSE label4

label3:
code for ALTERNATIVE_1
JUMP label5

label4:
code for ALTERNATIVE_2
JUMP label5

label5:
next statement

事实证明,对于简单的语言,只需要记住两个不完整的跳转语句(通常称为“真”和“假”)。因为可能有多个跳转到同一个目标,每一个实际上都是一个不完整跳转语句的链表,其中目标地址用于指向链表中的下一个跳转。因此,backpatching 遍历列表,在正确的目标中修补并使用原始目标找到需要修补的先前语句。

你所谓的标记(这是 yacc/bison 所指的“Mid-Rule Productions”的一个实例)与回补并没有真正的关系。它们可用于多种用途。在一次性代码生成中,经常需要在规则中间执行一些 Action ,回补只是一个例子。

例如,在假设的 if 语句中,有必要在解析 CONDITION 之前初始化 backpatch 列表,然后在 的开头进行 backpatch >THENELSE 子句。 (另一个回补将在整个 if 语句的解析结束时触发,但该回补将在规则的最终操作中。)

在规则中间执行操作的最简单方法是插入一个中间规则操作,这相当于插入一个带有操作的空“标记”产生式,如您指向的示例 Bison 文件中所示。

关于language-agnostic - 回补如何与标记一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21276726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com