我正在做一个口译员,我从ast类开始。 该代码是用c ++面向对象的。 每个动作都是一个“语句”,一个块本身就是一个语句,它包含一个语句列表。 块还定义了不同的作用域,记录了在该作用域内分配了哪些变量,并在变量末尾将其删除。 执行包含在主块中,该主块为其包含的每个语句调用“执行”,其中每个语句可以包含在另一个块中,一条简单指令或一个函数调用。 通过这种结构,我可以想到如何实现大多数构造(而if-else时),但是我不知道如何制作goto。尽管事实上gotos几乎没有被使用,但我仍需要goto作为实现break并继续循环的起点。
有人在概念上有建议吗? (从概念上讲,不需要实际的代码)。
注意:代码在解析时不会逐行执行,首先将其完全解析为ast,然后执行。
答案 0 :(得分:2)
如果您要goto
使用行号,只需将一个属性添加到AST节点类中,以指示在源中声明了该行。执行goto
节点时,在树中找到具有该行号的最高节点,并将其链接为goto
目标。
对于标签,您有一些选择。您可以将标签本身变成AST节点,也可以向节点类添加一个属性,该属性仅在上一条语句为标签时才设置。处理goto时,请执行与处理行号相同的操作。查找设置了标签属性的最顶层节点。
这假设您的目标出现在goto
之前的源中。否则,您将必须进行一次修正来解决调用目标,就像函数调用一样。
可能有更好的方法;这就是我想到的。
从本质上讲,您的转到是jmp
,您需要一种方法来解析目标地址。我只是解析源代码,然后进行第二遍修复所有的goto,这将有一个指向标签后的第一个AST节点的指针。