我想用我新创建的编程语言构建一个 Brainfuck(该死的名字)解释器,以证明它的图灵完备性。
现在,到目前为止一切都清楚了(<>+-,.
) - 除了一件事:循环 ([]
)。
我假设您从这里开始就知道(极其困难的)BF 语法:
伪代码是什么样的?当解释器到达循环开始时我应该做什么([
) 或循环结束 (]
)?
检查循环是否应该继续或停止不是问题(current cell==0
), but:
- 我必须在何时何地进行检查?
- 如何知道循环开始的位置?
- 如何处理嵌套循环?
由于循环可以嵌套,我想我不能只使用包含当前循环起始位置的变量。
我见过用各种语言实现的非常小的 BF 解释器,我想知道他们是如何设法让循环工作的,但无法弄清楚。
当你到达[
,您测试数据指针。
如果错误,您可以扫描下一个matched ]
字符,数出有多少个[
你看到并确保你在看到每一个时都将它们标记出来]
.
如果这是真的,您需要跟踪它的位置,以便稍后跳回它。我建议使用堆栈。将当前程序位置压入堆栈,然后当到达时]
,测试数据指针。如果为真,则转到堆栈中最顶层的程序位置。如果为 false,则将该位置从堆栈中弹出并继续。
当您嵌套到内部循环中时,堆栈将清楚地记录每个循环的上下文。
See 堆栈(维基百科) http://en.wikipedia.org/wiki/Stack_(data_structure)。这类似于汇编程序处理函数调用的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)