这学期我正在为我的一门课编写一个编译器,虽然我有一个符号表的工作实现,但我对它的实现有点不舒服。由于我在 Python 中进行项目,因此我决定采用 OO 方法,并且我的 AST 节点都有accept
实现访问者模式的方法。我有preVisit
和postVisit
所有类型节点的方法,我使用它们进入/退出新范围并向表添加新绑定。它有效,但我对我的符号表是“短暂的”并绑定到这个访问者类这一事实感到不安。我通过子类化符号表访问者类来实现类型检查,并且我需要非常小心地调用超类,将它们准确地放在正确的位置。这种实现的脆弱性以及编译器的任何阶段都需要与访问者类紧密耦合的事实让我有些不安。
我想知道人们通常以哪些其他方式实现符号表?由于该信息是纯静态的,是否可以直接将其添加到 AST 节点中?有没有办法创建一个可以创建一次的表并且可以在正确的上下文中查找符号?另外,纯函数式程序员如何解决这个问题?