私はRubyで書かれたコンパイラーに取り組んでおり、現在セマンティック分析段階(タイプチェック)にいます。事前注文と事後注文の2つの方法で訪問する必要のあるASTがあります。これを行うための最良の方法は、Rubyで何であるか疑問に思いました。ブロックを渡すのは基本的にVisitorPatternであることは知っていeach
ますが、2つの方法(pre、post)で訪問する必要があり、Rubyはメソッドのオーバーロードをサポートしていないため、これにアプローチする方法がわかりません。
(注:Nodeオブジェクトに訪問方法を制御させようとしているので、訪問者が肥大化することはありません)
これが私が試みることについて考えていることです:
ノードクラスごとに2つの受け入れメソッドがあり、他のノードの対応するメソッドとメソッドaccept_pre
をaccept_post
呼び出します。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
2つの注文が必要なのに、で行うことはできますか?
どんな助けでもいただければ幸いです。