回溯如何与标记一起使用?

2023-12-01

我在互联网上进行了搜索,但找不到关于回填如何工作的正确解释?

您能解释一下回溯是如何工作的吗?它如何与markers?

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

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

I found 这段代码,其中他们获取输入文件并使用 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正在生成,不知道在哪里生成label1 and label2是,并且当代码为ALTERNATIVE_1 and ALTERNATIVE_2正在生成,不知道在哪里生成label3 is.

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

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

事实证明,在许多情况下,您最终会得到同一个标签的多个分支。一个典型的例子是像 C 系列那样的“短路”布尔值&& and ||运营商。例如,扩展原始示例:

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

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

你所说的标记(这是 yacc/bison 所说的“中规则生产”的一个实例)与回补并没有真正的关系。它们可用于多种目的。在一次性代码生成中,通常需要在规则中间执行某些操作,回补只是一个例子。

例如,在假设的if语句,有必要在执行之前初始化 backpatch 列表CONDITION被解析,然后在开头进行回补THEN and ELSE条款。 (在整个解析结束时将触发另一个backpatchif声明,但该声明将出现在规则的最终操作中。)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

回溯如何与标记一起使用? 的相关文章

  • 当 C# 位于同一包含类中时,为什么以及如何允许访问类本身之外的私有变量?

    我不知道这个问题是否具有足够的描述性 但是这种行为为什么以及如何存在 public class Layer public string Name get set private IEnumerable children public IEn
  • 使用 std::function w/ std::bind 时的 EXC_BAD_ACCESS

    升级到 XCode 5 后 使用 std function 和 std bind 似乎会生成 EXC BAD ACCESS 异常 看起来好像 std function 实现中的 base 指针最终为空 导致访问错误 但我不清楚为什么会出现这
  • 非模板类与模板类的多个定义

    为什么编译器会抱怨多个 cpp 文件中定义的非模板类 但对于其定义在各个 cpp 文件中重复的模板类 通过包含该类的 inl 文件 却没问题 即使类是否在多个 cpp 文件中显式实例化 非模板情况是因为在这种情况下您的程序违反了一个定义规则
  • 承诺的反面是什么?

    承诺代表将来可能可用 或无法实现 的值 我正在寻找的是一种数据类型 它表示将来可能变得不可用的可用值 可能是由于错误 Promise a b TransitionFromTo
  • 有向无环图的人类可读文本表示

    一棵树有一堆人类和机器可读的文本表示 例如嵌套列表 以各种表示形式 例如 JSON 和 YAML 和 XML 与缩进相结合 它们使我们很容易想象得到的结构 但我没有看到任何具有相同水平可读性的东西有向无环图 https en wikiped
  • 安全网络登录示例/教程[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为 Web 应用程序创建登录表单的方法有很多种 但大多数方法都存在这样或那样的缺陷 密码以明文形式传输
  • 如果数据库可访问,加盐和散列有什么意义?

    我刚刚学习了散列的概念 嘿 不要忘记盐 并使用盐来确保密码安全 散列它是一种单向加密 实际上不是加密而是散列 因此无法对其进行逆向工程 加盐是在散列之前在密码上添加随机创建的值的前缀或附加值 因为散列 只是散列 的问题是 一些天才提供了字典
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 什么是应用程序二进制接口 (ABI)?

    我从来没有清楚地理解什么是 ABI 请不要向我指出维基百科文章 如果我能理解的话 我就不会在这里发这么长的帖子了 这是我对不同接口的看法 电视遥控器是用户和电视之间的接口 它是一个现有的实体 但本身没有用 不提供任何功能 遥控器上每个按钮的
  • 将代码拆分为多个 .cpp 会减少编译时间吗?

    假设我正在处理一个相当复杂的课程 一半的方法已经完成并经过测试 但我仍在开发另一半 如果我将完成的代码放在一个 cpp 中 将其余代码放在另一个 cpp 中 那么当我仅更改 正在进行的 cpp 中的代码时 Visual Studio 或任何
  • Java代码编译器优化[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道 给定一个 java 代码 我如何才能看到 Java 编译器如何优化它 有没有 JDK 工具可以实现这一点 试图用谷歌搜索 但没有
  • 编译过程

    谁能解释一下编译是如何工作的 我似乎无法弄清楚编译是如何工作的 更具体地说 这是一个例子 我正在尝试在 MSVC 6 中编写一些代码来加载 Lua 状态 我已经 设置库的附加目录并将文件包含到正确的目录中 使用 extern C 因为 Lu
  • 有没有办法在 OSX 中安装 gcc 而无需安装 Xcode?

    我用谷歌搜索了一下 似乎没有办法在 OS X 上安装 gcc 而不安装 Xcode 至少需要 1 5GB 的空间 我需要的只是 gcc 而不是 Xcode 附带的其他垃圾 此时 我将采用任何其他类型的 C 编译器 我知道我可以简单地安装 X
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 评估 CRC-32 实现中的差异

    我见过相同基本 CRC 32 算法的许多不同实现 如下所示 int remain int sbox SIZESBOX int dividend int bit for dividend 0 dividend lt SIZESBOX divi
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 奖励*完整*初学者的代码项目[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为刚接触编程的人提供的课程通常包括一个代码项目 我认为这是一种很好的学习方式 然而 这样的项目往往让人感觉过于做作 因此做起来并没有多大回
  • 为什么这些冲突出现在以下 XML 的 yacc 语法中

    我有以下 XML 语法 效果很好 program lt ID attribute list gt root root lt ID attribute list gt node list lt ID gt node list node s n
  • 获取N个随机数,其总和为M

    我想得到N个随机数 其总和是一个值 例如 假设我想要 5 个总和为 1 的随机数 那么 一个有效的可能性是 0 2 0 2 0 2 0 2 0 2 另一种可能性是 0 8 0 1 0 03 0 03 0 04 等等 我需要这个来创建模糊 C
  • 领域驱动设计与模型驱动架构

    我很好奇 领域驱动设计和模型驱动架构有什么区别 我的印象是他们有某些相似之处 你能启发我吗 Thanks 不要不同意上面的大部分内容 尽管它可能值得稍微扩展一下 DDD 中最重要的一个概念是关注问题域 将对技术的痴迷放在一边 主要集中于对您

随机推荐

  • Opera PreventDefault() on keydown 事件

    我正在尝试在我的网络应用程序中嵌入一些按键绑定 但我在 Opera 上遇到了困难 我有这个代码 window onkeydown function e var key e keyCode e keyCode e charCode e cha
  • 当我编织时,Rstudio 正在删除关键文件(PDF 和 HTML)

    所以我正在做一场 R 噩梦 我已经返回到在 RStudio 的上一次迭代 或可能更多 下构建的项目 我制作了一份可行的报告 并要求我更新 而我当前的烦恼那时并不存在 发生的情况如下 My report file is ISS Time Se
  • 批处理:搜索字符串以跳过上面的行并将结果写入新文件

    我已经成功编写了一个脚本 它需要一个字符串在特定文件中搜索 然后输出它第一次出现的行 然后我将该值放入 for 循环中并跳过解析该行数并写入它内容到一个新文件 然而 我没有得到空行 我发现这很难解决 我正在搜索的字符串是 缓存它出现的行号
  • java.lang.NoSuchFieldError:VERSION_2_3_0

    我刚刚将 Struts2 版本升级到 2 5 2 然后开始出现错误 我的应用程序甚至无法启动 我对 pom xml 和 web xml 进行了更改 我不确定我是否错过了任何课程 但日志没有这么说 pom xml
  • 如何使用 .NET 从现有 VFP (OLEDB) 表创建新的 VFP (OLEDB) 表?

    我们有一个创建许多 Visual Foxpro DBF 表的应用程序 每个表都有不同的架构 但它们都包含一个已知的日期字段 我被要求创建另一个应用程序 在 C 中 它将上周的数据从每个表复制到一个新表 在与源表不同的文件夹中 不同的表将保留
  • 如何使用 C# 在 ListBox 中创建多于 2 列?

    如何在 ListBox 中创建超过 2 列 以及如何插入数据 使用 C 提前致谢 Use UseCustomTabOffsets and CustomTabOffsets如下面的 VB NET 示例所示 Public Class Form1
  • printf(0, "%d", num) 中的 0 有什么作用?

    我通常用 C 编写代码 但我正在用 C 开发一个项目 我遇到了具有以下语法的 printf printf 0 d n num 我环顾四周 找不到 printf 中第一个 0 的作用的解释 有人可以向我解释一下吗 谢谢 Because xv6
  • 在 Angular2 应用程序中使用 GeoFire

    我正在尝试在我的 Angular2 RC5 应用程序中设置 GeoFire 我已经使用 npm 安装了 geofire 和 firebase 并配置了 systemjs 来导入它 这是我的 package json name MyProje
  • 如何确保我的程序只能执行一个实例?

    我希望我的程序 Java 可执行文件 jar 仅运行一次 我制作了一个程序 但现在我希望用户不能打开多个实例 感谢您的时间 我检查了服务器 客户端解决方案和锁定文件 但我不太了解它们 我也尝试让它们在 NetBeans 中运行 但没有成功
  • 如何在 Rx 中使用新的 BufferWithTimeOrCount 返回 IObservable> 而不是 IObservable>

    在 Windows Phone 7 上有一个新版本带时间或计数的缓冲区IObservable 的扩展方法 返回 流的流 而不是之前的 列表的流 我在尝试使用新方法或旧方法时遇到困难 所以也许我只是不明白它是如何工作的 但我的目标是创建一个流
  • 将动态数量的项目划分为列

    我有动态数量的项目 需要将其中分成几列 假设我得到了这个 array one two three four five six seven eight 我需要生成这个 ul li one li li two li li three li li
  • JBOSS 7.1.1 中 DLL 的路径设置

    我们有一些与以下相关的 DLLJava VB In Joss 4 X 我们以前是放在Application Server下的bin目录下的 我们迁移到JBOSS 7 1 1当我从 bin 目录中删除并将它们放入库文件夹中时C jboss a
  • 如何将 Stripe Connect 与 Node.js 集成?

    因此 我现在处于您登录 Stripe 帐户的部分 完成后它会将您重定向到我的网站 我不知道下一步该做什么 而且文档也很难理解 因为我没有任何 Node js 经验 我只需要一些关于该怎么做的指导 单击 授权 按钮后 在您的重定向 URI 处
  • 获取 Android 麦克风的分贝

    我已经搜索了一段时间了 但一直没能找到一种方法来实际从 Android 上的麦克风获取 SPL db 值 我发现讨论它的少数线程和文章将其视为某种东西so显然 任何人都应该能够做到这一点 并且更关心的是让他们的转换算法正确 有谁知道如何做到
  • Python 套接字:gethostbyaddr:反向 DNS 查找失败

    我在使用时获取主机名时遇到问题socket gethostbyaddr ip addr 在特定网站上 我不会详细说明这不适用于哪个网站 因此 按名称获取主机对于到目前为止我尝试过的每个网站都可以正常工作 但是当我尝试从中获取网站名称时 我收
  • 从 iPhone 应用程序传输 MP3 的最佳方式?

    我正在开发一个应用程序 它将通过 iPhone 应用程序从我的服务器传输音乐 这是我的第一个 iPhone 应用程序 所以我有点困惑 最好的办法是什么 这 是否已经内置了一些东西 我可以使用它 就像 MP3 播放器一样 我只需要指向 正确的
  • TypeScript 返回以泛型形式构造的对象

    我想定义以下通用函数来处理从接口类型到实现该接口的类类型的转换 考虑以下接口 类对 interface IExample num number class Example implements IExample num number 基本上
  • Spotfire 从计算列中查找值

    我在 Spotfire 中有一个数据集 我正在其中创建一个返回实体名称的计算列 返回的实体名称也在 A 列中 从计算列返回实体名称后 我需要一个位于不同列但位于实体名称行上的数据属性 我附上了数据快照 计算字段返回 公司 C 我需要创建一个
  • 实体框架仅返回一个值,但列表大小正确

    实体框架仅返回一个值 但列表大小正确 我有一个没有主 ID 的表 我需要获取或选择其中的所有值 我看到的是 当我使用 linq 进行选择时 对象的数量是正确的 但它一遍又一遍地是第一行 我只是在做这样的事情 List
  • 回溯如何与标记一起使用?

    我在互联网上进行了搜索 但找不到关于回填如何工作的正确解释 您能解释一下回溯是如何工作的吗 它如何与markers 我知道它有两种主要类型的标记 其中有下一个四边形 其中包含下一个列表 I found 这段代码 其中他们获取输入文件并使用