我正在开发一个用 Ruby 编写的编译器,目前正处于语义分析阶段(类型检查)。我有一个 AST,我需要通过两种方式访问:预购和后购,我想知道在 Ruby 中最好的方法是什么。我知道将块传递给each
本质上是访问者模式,但由于我需要以两种方式(前、后)访问,而 Ruby 不支持方法重载,我不知道如何处理这个问题。
(注意:我试图让 Node 对象控制它们的访问方式,所以我的访问者不会臃肿)
这是我正在考虑的尝试:
每个 Node 类有两个 accept 方法accept_pre
,accept_post
调用其他 Node 对应的accept_pre
和accept_post
方法
class Node
def initialize(a, b, c)
@a, @b, @c = a, b, c
end
def accept_pre(visitor)
@a.accept_pre visitor
@b.accept_pre visitor
@c.accept_pre visitor
vistor.visit_node(self)
end
def accept_post(visitor)
visitor.visit_node(self)
@c.accept_post visitor
@b.accept_post visitor
@a.accept_post visitor
end
end
有一个更好的方法吗?.each
即使我需要两个订单,它也可以完成吗?
任何帮助,将不胜感激。