【问题标题】:logic suggestions for interpreter ast building解释器 ast 构建的逻辑建议
【发布时间】:2026-02-02 06:40:01
【问题描述】:

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

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

注意:代码在解析时不是逐行执行,而是先完全解析成一个ast,然后再执行。

【问题讨论】:

  • 问题非常广泛,并导致主观意见。缩小到具体问题。

标签: oop abstract-syntax-tree interpreter


【解决方案1】:

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

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

这假设您的目标出现在源中goto 之前。否则,您将不得不执行修复传递来解析调用目标,就像函数调用一样。

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

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

【讨论】: