forth - Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?

标签 forth language-implementation

LOOP 一词被描述为“解析所有未解析的 LEAVE 事件的目的地”。 (强调我的)

与 IF ... ELSE ... THEN 的前向引用数始终为 1 不同,LOOP 对 LEAVE 的数量没有限制。那怎么实现呢?

我想到的一种方法是始终将 LEAVE 的数量保持在堆栈顶部。每个 LEAVE 都会增加此计数器并将其置于其下。 LOOP 从顶部读取计数器并解析那么多引用。但这似乎是一个便宜的伎俩。

真正的 Forth 系统如何实现这种循环?我不需要 teh codez(将 Forth 作为学习经验实现),只需要概念。

最佳答案

在 SP-Forth 中,循环控制参数包括 LOOP 之后的索引、限制和地址。所以,不需要解析 LEAVE在编译时,它知道运行时循环控制参数的地址。
另一种方法是将控制流堆栈深度存储在 DO 上。 ,将未解析的前向引用放在控制流堆栈上的所有其他已放置值(使用存储的深度)下 LEAVE ,然后解析 LOOP 上所有放置的前向引用.
看我的 high-level implementationDO LOOP基于BEGIN UNTILAHEAD THEN (剧透警告)。

关于forth - Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58304029/

相关文章:

interpreter - 在 Nimrod 中的 Brainfuck 翻译

c++ - C++的多重继承是如何实现的?

performance - 算法复杂度分析 : practically using Knuth's Ordinary Operations (oops) and Memory Operations (mems) method

compiler-construction - Haskell 编译器是如何工作的?

python - 为什么在将 Python 中的生成器传递给函数时可以省略周围的括号?

第四 - 如何实现字访问硬件寄存器中的位域?

memory-management - Forth 中的内存管理

exception-handling - 异常帧与返回堆栈上的其他数据有何区别?

assembly - 如何使用 GDB 调试 jonesforth?