后面如何定义符号表跟踪函数?

问题描述 投票:0回答:1

我正在尝试编写一个编译器,但卡在了一个步骤上: 如何制作符号表来支持后面定义的跟踪函数: 这是一个 golang 代码示例:

func first(){
  second()
}

func second(){
}

我已经了解了代码的概要。我想为范围构建嵌套符号表。 我正在旅行,当我遇到第一次调用“second()”时,因为符号“second”仍然不在符号表中(尚未旅行),所以我无法决定是否“second()”是否合法。 我知道我可以遍历树两次来解决这个问题。但它似乎使代码变得更加复杂。 只是想知道普通编译器如何解决这个问题?如果他们遍历树两次,它如何保存符号表以支持第二次遍历时节点可以找到符号表? 我知道我可以使用列表将符号表链接在一起,但我不知道如何解决这个问题。

go compiler-construction symbol-table
1个回答
0
投票

如果他们遍历树两次,它如何保存符号表以支持第二次遍历时,节点可以找到符号表?

听起来您正在考虑对 AST 进行一次完整的传递,然后再对 AST 进行另一次完整的传递。相反,请考虑部分传递 AST 的某些部分。例如,当您遇到范围定义构造时,您可以快速传递该构造以获取其中定义的符号,然后再次传递该构造以检查引用是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.