在解释器中实现 Brainfuck 循环

2024-01-11

我想用我新创建的编程语言构建一个 Brainfuck(该死的名字)解释器,以证明它的图灵完备性。

现在,到目前为止一切都清楚了(<>+-,.) - 除了一件事:循环 ([])。 我假设您从这里开始就知道(极其困难的)BF 语法:

  • 如何在解释器中实现 BF 循环?

伪代码是什么样的?当解释器到达循环开始时我应该做什么([) 或循环结束 (])?

检查循环是否应该继续或停止不是问题(current cell==0), but:

  • 我必须在何时何地进行检查?
  • 如何知道循环开始的位置?
  • 如何处理嵌套循环?

由于循环可以嵌套,我想我不能只使用包含当前循环起始位置的变量。

我见过用各种语言实现的非常小的 BF 解释器,我想知道他们是如何设法让循环工作的,但无法弄清楚。


当你到达[,您测试数据指针。

如果错误,您可以扫描下一个matched ]字符,数出有多少个[你看到并确保你在看到每一个时都将它们标记出来].

如果这是真的,您需要跟踪它的位置,以便稍后跳回它。我建议使用堆栈。将当前程序位置压入堆栈,然后当到达时],测试数据指针。如果为真,则转到堆栈中最顶层的程序位置。如果为 false,则将该位置从堆栈中弹出并继续。

当您嵌套到内部循环中时,堆栈将清楚地记录每个循环的上下文。

See 堆栈(维基百科) http://en.wikipedia.org/wiki/Stack_(data_structure)。这类似于汇编程序处理函数调用的方式。

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

在解释器中实现 Brainfuck 循环 的相关文章

  • 使用标记列表构建抽象语法树

    我想从令牌列表构建 AST 我正在制作一种脚本语言 并且已经完成了词法分析部分 但我不知道如何创建 AST 所以问题是 我该如何采取这样的事情 WORD int WORD x SYMBOL NUMBER 5 SYMBOL 并将其转换为抽象语
  • 如何写一个解释器?

    我决定用 Ruby 编写一个小型解释器作为我的下一个项目 我需要什么知识 技能才能成功 我还没有决定要解释的语言 但我正在寻找一种不是玩具语言 但相对容易编写解释器的语言 提前致谢 你至少必须学习 词法分析 将字符分组为标记 解析 将标记分
  • 如何为 PyInstaller 可执行文件指定 Python 版本和库版本

    使用 PyInstaller 创建可执行文件时 如何捆绑特定的 Python 解释器和特定版本的某些库 我想从 py 脚本创建一个可执行文件 我的 main py从网站下载一些数据并进行转换 然后将它们作为 Excel 文件保存在文件夹中
  • REPL、解释器和编译器之间的关系

    From 维基百科 REPL 通常被误称为 口译员 这是一个用词不当 很多 使用的编程语言 编译 包括字节码 编译 有 REPL 例如 Common Lisp 和 Python From 对此帖子的回复 交互式解释器使用 REPL 一个 口
  • 为什么 Python 中的列表理解比 map() 更快?

    我正在研究Python中类似循环结构的性能问题 发现以下语句 除了列表推导式的语法优势之外 它们通常还 与同等使用地图一样快或更快 性能技巧 列表推导式的运行速度比等效的 for 循环要快一些 除非 你只会丢弃结果 蟒蛇速度 我想知道幕后的
  • 关于传统解释器、编译器和 JIT 编译器/解释器的澄清

    我正在学习 Java 以下事情对我来说有点困惑 我的理解是 Java编译器 Java 编译器只是转换 java程序进入 class文件 这意味着将我们的源代码转换为字节码 它是虚拟机 JVM 的操作码列表 这使得 Java 平台无关 Jav
  • 如何拦截LLVM lli工具输入?

    我想使用 LLVMlli工具作为静态库 重命名main to lli 并将其导出到 libLLi a 为其创建丰富的 UI 我如何修改它 或不加修改地使用 以拦截标准输入 假设我知道如何生成 LLVM 汇编文件 使用clang S emit
  • Sublime Text 2 - 在解释器中运行选定的 python 代码

    在 Sublime Text 编辑器中编辑 python 脚本时 我想逐行运行脚本 或者在嵌入式解释器中逐块运行脚本 有没有一个方便的方法来做到这一点 对我来说完美的方法是 选择几行代码 点击快捷方式 这将在解释器中运行选定的代码 我认为有
  • 编译器 vs 解释器 vs 转译器

    在我参加的 ReactJS 会议中 演讲者使用了一个术语转译器对于一些代码转换 移植的发生 过去 我听说过编译器和解释器这两个术语 我在将用户编写的语言代码转换为计算机系统上可运行的形式的上下文中使用过 转译器对我来说是新的 转译器与编译器
  • 数学表达式的自定义解释器

    我必须评估大量包含变量的表达式 并且我正在考虑编写一个小型自定义解释器以保持编译快速且小型 但是我对这个主题没有经验 并且有一些问题 假设我们有一个包含数学表达式和一组有限对象的文件 该文件可能如下所示 expr x y z 2 x y x
  • 如何从“Android终端模拟器”调用Rebol解释器?

    我需要从以下位置调用 Rebol 语言解释器作为运行脚本文件的命令 例如rebol script name reb 所以我不是在寻找仅在 Rebol 中启动的 APK 应用程序REPL http en wikipedia org wiki
  • 在解释器中实现 Brainfuck 循环

    我想用我新创建的编程语言构建一个 Brainfuck 该死的名字 解释器 以证明它的图灵完备性 现在 到目前为止一切都清楚了 lt gt 除了一件事 循环 我假设您从这里开始就知道 极其困难的 BF 语法 如何在解释器中实现 BF 循环 伪
  • 编写编程语言的建议? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于想要编写编程或脚本语言的人 您可以提供哪些建议 我 我不担心如何编程或设计编译器 而是担心如何使用工具和代码生成器快速开发编译器
  • 用 Haskell 解释 Parigot 的 lambda-mu 演算

    我们可以用 Haskell 来解释 lambda 演算 data Expr Var String Lam String Expr App Expr Expr data Value a V a F Value a gt Value a int
  • 高级:为什么 ?function(){} 在 R 中有效

    我了解 R 中的一些运算符和函数在使用帮助函数之前需要反引号 但是 我不明白为什么 function 也有效 有人对此有任何想法吗 让我们看看会发生什么 的代码使用 flow 包 它可以帮助您检查代码所采用的逻辑路径 遵循整行 flow f
  • 持久的 Python 命令行历史记录

    我希望能够 向上箭头 指向我在以前的 Python 解释器中输入的命令 我已经找到了readline模块提供以下功能 read history file write history file and set startup hook 我还不
  • 注释会减慢解释语言的速度吗?

    我问这个问题是因为我使用 Python 但它也适用于其他解释语言 Ruby PHP JavaScript 每当我在代码中留下评论时 我是否会减慢解释器的速度 根据我对解释器的有限理解 它以字符串形式读取程序表达式 然后将这些字符串转换为代码
  • 如何使用 GPU 使用 tf.lite.Interpreter(在 python 中)运行 tflite 模型 (*.tflite)?

    我已根据以下说明将张量流推理图转换为 tflite 模型文件 tflite https www tensorflow org lite convert https www tensorflow org lite convert 我在我的 G
  • 值的 Ocaml 表示 - 原子

    我查看了一些 OCaml 值的内部表示 空数组的表示是atom 0 即一个块tag 0 and size 0 空浮点数数组由atom 0 too 是否存在由原子表示的任何 OCaml 值tag gt 0 如果不是 OCaml 字节码集包含以
  • 与 CPython、Jython 和 IronPython 相比,PyPy 能提供什么?

    从我在博客上看到和读到的内容来看 PyPy 是一个非常雄心勃勃的项目 与它的兄弟姐妹 CPython Jython 和 IronPython 相比 它会带来哪些优势 是速度 跨平台兼容性 包括移动平台 在没有 GIL 的情况下使用 c 扩展

随机推荐

  • 严格模式下不允许使用八进制文字

    我正在使用 Angular 2 当我在 SCSS 文件中使用它时 效果很好 text after content 00a0 00a0 然而 当我把它搬进去时 styles 表明 未捕获的语法错误 严格模式下不允许使用八进制文字 我知道代码s
  • 从数组 javascript 中删除元素(相反交集)

    昨天晚上我提出了这个问题从数组javascript中删除元素 https stackoverflow com questions 29711165 delete elements from array javascript但我错误地认为 我
  • 渲染与部分渲染和良率之间的差异

    我已经从 Rails 指南中读到了它 已经看过 Micheal Hartel 的书 现在又从 Rails View 的书中读到了它 但我仍然感到困惑 有一个 footer html erb文件 因此它是一个 部分 并且在它编写的代码中 所以
  • C 中指向二维数组的指针

    我知道有几个关于提供良好 和有效 解决方案的问题 但恕我直言 没有一个问题清楚地说明实现这一目标的最佳方法是什么 所以 假设我们有一些二维数组 int tab1 100 280 我们想要创建一个指向这个二维数组的指针 为了实现这一目标 我们
  • iOS - 将 NSDictionary 写入 Localized.strings

    这个问题是那个问题的连续体 iOS 我可以在运行时更改 localized strings 内容吗 https stackoverflow com questions 13625008 ios could i change the loca
  • 手工制作的强类型 ADO.net 数据表 - 它可以更干净吗?

    我最近遇到一个非常简单的类型化数据表 不使用 XSD 我丢失了作者的 URL 所以我不能相信他 但看起来有很多重复的代码 例如添加 删除 GetNewRow 方法 我尝试将重复的方法推入超类中 但由于 Employee 需要通用 因此出现了
  • 为什么 F# printfn 没有通过 Console.WriteLine 实现?

    我注意到使用 F printfn 时出现意外行为 它似乎将格式字符串分解为块 并为每次调用 printfn 多次调用 Console Write 我希望它格式化整个字符串 然后调用 Console WriteLine 一次 我注意到这一点是
  • 将 ASP.NET MVC ViewResult HTML 渲染为图像,无需第三方组件

    有没有办法将 ViewResult 或 PartialViewResult 渲染为图像 我尝试将 ViewResult 作为字符串获取 并且得到了一个包含 html 的字符串 但我需要将该 html 渲染为图像 如果可能的话 带样式和图像
  • Angular2 中的文件内容

    我正在编写一个小应用程序来执行一些 XML 文件聚合 用户删除一些具有相同结构的 XML 文件 编辑一些常见标签 然后我向他们返回一个 xml 其中包含元素列表中的所有所需数据 我正在使用 ng2 file upload 来进行文件删除 但
  • Java定义显式包私有修饰符[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 显然Java有一个Access级别包私有 https docs oracle com javase tutorial java javaOO a
  • 路径验证 - 我的正则表达式匹配格式错误的路径,但我不明白为什么

    这是我现在的表情 https regex101 com r BertHu 4 https regex101 com r BertHu 4 a z a z0 9 a z0 9 lt gt r n lt gt r n lt gt r n 我使用
  • IIS6中哪个w3wp.exe进程属于哪个应用程序池(使用powershell)

    到目前为止 我使用这个工具来判断哪个 w3wp 属于哪个应用程序池 c windows system32 cscript iisapp vbs 如何使用 Powershell 提取相同的信息 或者也许会得到更多信息丰富的结果 谢谢 这绝不是
  • 为什么 Scanf 在获取角色时工作很奇怪

    程序说明 我编写了一个程序 它接受用户无限号的字符输入 次数并打印输入的输入 这是程序 include
  • Pandas:使用合并单元格读取 Excel

    我有包含多个工作表的 Excel 文件 每个工作表看起来都有点像这样 但更长 Sample CD4 CD8 Day 1 8311 17 3 6 44 8312 13 6 3 50 8321 19 8 5 88 8322 13 5 4 09
  • 速度:将聚合值存储在数据库中还是使用 Jinja 进行计算?

    语言 Python 数据库 SQLite 使用 Flask SQLAlchemy ORM 我的问题本身可能有点过分了 但我很好奇 我在 SQLAlchemy 中有列Table其中包含我需要执行数学运算的某些值 以显示聚合值或计算值 我们假设
  • 如何通过.NET/C# 查找CPU 核心数?

    有没有办法通过 NET C 找出CPU核心数 PS这是一个直接的代码问题 而不是 我应该使用多线程吗 问题 您可以获得与处理器相关的多种不同信息 物理处理器数量 核心数 逻辑处理器的数量 这些都可以不同 如果机器具有 2 个支持超线程的双核
  • Django 1.9 不会在链接中呈现正确的页面

    演示 urls py from django conf urls import url include patterns from django contrib import admin import views from import v
  • 用于嵌入式系统的 C 语言中最快的数组查找算法?

    假设我有一个定义大小为 22 的浮点数常量数组 如下所示 array 0 0 array 1 0 5 array 2 0 7 array 3 1 8 array 21 4 2 该数组的值是单调的 也就是说 它们总是随着索引增加 array
  • 推送通知服务器端实现

    最近 我已将 FCM 集成到我的应用程序最新版本中 但我以前版本的应用程序使用的是 GCM 关于我们是否需要为 GCM 和 FCM 分离后台 cron 的写入有什么想法吗 我的先前版本 MY App 4 0 使用了 GCM 当前版本 My
  • 在解释器中实现 Brainfuck 循环

    我想用我新创建的编程语言构建一个 Brainfuck 该死的名字 解释器 以证明它的图灵完备性 现在 到目前为止一切都清楚了 lt gt 除了一件事 循环 我假设您从这里开始就知道 极其困难的 BF 语法 如何在解释器中实现 BF 循环 伪