Oop 对ast建设的逻辑建议

Oop 对ast建设的逻辑建议,oop,abstract-syntax-tree,interpreter,Oop,Abstract Syntax Tree,Interpreter,我正在制作一个解释器,我从ast类开始。 代码是面向对象的C++。 每个动作都是一个“语句”,一个块本身就是一个语句,它包含一个语句列表。 块还定义不同的作用域,记录在该作用域内分配了哪些变量,并在结束时删除这些变量。 执行包含在主块中,为它包含的每个语句调用“execute”,其中每个语句可以包含在另一个块中,一条简单指令或一个函数调用。 有了这个结构,我可以想到如何实现大多数构造(虽然,如果不是的话),但我不明白如何实现一个goto。尽管goto几乎不被使用,但我需要goto作为实现循环中断

我正在制作一个解释器,我从ast类开始。 代码是面向对象的C++。 每个动作都是一个“语句”,一个块本身就是一个语句,它包含一个语句列表。 块还定义不同的作用域,记录在该作用域内分配了哪些变量,并在结束时删除这些变量。 执行包含在主块中,为它包含的每个语句调用“execute”,其中每个语句可以包含在另一个块中,一条简单指令或一个函数调用。 有了这个结构,我可以想到如何实现大多数构造(虽然,如果不是的话),但我不明白如何实现一个goto。尽管goto几乎不被使用,但我需要goto作为实现循环中断和继续的起点

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


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

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

对于标签,您有几个选项。您可以将标签转换为AST节点本身,或者向节点类添加一个属性,该属性仅在前面的语句是标签时设置。在处理转到时,执行与处理行号相同的操作。查找已设置标签属性的最顶层节点

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

也许有更好的方法;这正是我想到的


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

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

对于标签,您有几个选项。您可以将标签转换为AST节点本身,或者向节点类添加一个属性,该属性仅在前面的语句是标签时设置。在处理转到时,执行与处理行号相同的操作。查找已设置标签属性的最顶层节点

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

也许有更好的方法;这正是我想到的


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

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