我正在尝试编写一个编译器,但卡在了一个步骤上: 如何制作符号表来支持后面定义的跟踪函数: 这是一个 golang 代码示例:
func first(){
second()
}
func second(){
}
我已经了解了代码的概要。我想为范围构建嵌套符号表。 我正在旅行,当我遇到第一次调用“second()”时,因为符号“second”仍然不在符号表中(尚未旅行),所以我无法决定是否“second()”是否合法。 我知道我可以遍历树两次来解决这个问题。但它似乎使代码变得更加复杂。 只是想知道普通编译器如何解决这个问题?如果他们遍历树两次,它如何保存符号表以支持第二次遍历时节点可以找到符号表? 我知道我可以使用列表将符号表链接在一起,但我不知道如何解决这个问题。
如果他们遍历树两次,它如何保存符号表以支持第二次遍历时,节点可以找到符号表?
听起来您正在考虑对 AST 进行一次完整的传递,然后再对 AST 进行另一次完整的传递。相反,请考虑部分传递 AST 的某些部分。例如,当您遇到范围定义构造时,您可以快速传递该构造以获取其中定义的符号,然后再次传递该构造以检查引用是否有效。