解释器ast构建的逻辑建议

logic suggestions for interpreter ast building

我正在做一个解释器,我从ast开始类。 该代码在 C++ 中是面向对象的。 每个动作都是一个"statement",一个块本身就是一个语句,它包含一个语句列表。 块还定义了不同的范围,记录在该范围内分配了哪些变量并在其末尾删除它们。 执行包括主块调用 "execute" 它包含的每个语句,其中每个语句可以包含在另一个块中,一个简单的指令或一个函数调用。 有了这个结构,我可以想到如何实现大多数结构(同时,if-else),但我不明白我怎么能跳转到。尽管事实上 goto 几乎不被使用,但我需要 goto 作为实现 break 和 continue for 循环的起始基础。

有人有概念上的建议吗? (从概念上讲,不需要实际代码)。

注意:代码在解析时不是逐行执行的,它首先完全解析成ast,然后执行。

如果您要goto查看行号,只需向您的 AST 节点添加一个属性 class 以指示它在源代码中的哪一行声明。执行 goto 节点时,找到树中具有该行号的最高节点,并将其 link 作为您的 goto 目标。

对于标签,您有几种选择。您可以将标签本身变成一个 AST 节点,或者向节点 class 添加一个属性,该属性仅在前一个语句是标签时才设置。处理 goto 时,执行与处理行号相同的操作。查找具有标签属性集的最顶层节点。

这假设您的目标出现在 goto 之前的源中。否则,您将不得不进行修复传递以解析调用目标,这与函数调用非常相似。

可能有更好的方法;这就是我想到的。

本质上,你的goto是一个jmp,你需要一种方法来解析目标地址。我只是解析源代码,然后进行第二次传递以修复任何 gotos,它将有一个指向标签后第一个 AST 节点的指针。