(免責事項: これらの例は、コンパイラを構築するという文脈で与えられていますが、この質問はすべてビジター パターンに関するものであり、コンパイラ理論の知識は必要ありません。)コンパイラの理論を独学で学んでいますが (いや、これは宿題ではありません)、彼がビジター パターンを使用して AST を IR ツリーに変換する方法を理解するのに苦労しています。(注: Python でこれを行っているので、Python も学習できます。これが、次の例が Java ではない理由です。) 私が理解しているように、Visitor パターンの visit メソッドと accept メソッドは設計により void 型になっています。だから私が何かを持っているなら
class PlusExp(Exp):
def __init__(self, exp_left, exp_right):
self.exp_left = exp_left
self.exp_right = exp_right
def accept(self, v):
v.visit_plus_exp(self)
次に、次のようなビジターメソッドを記述できるようにしたいと思います
def visit_plus_exp(self, plus_exp):
return BINOP(BinOp.PLUS,
plus_exp.exp_left.accept(self),
plus_exp.exp_right.accept(self))
これにより、2 つの子式が IR に変換され、プラス式を表す BINOP にリンクされます。もちろん、追加情報を返すようにすべての受け入れ関数を変更しない限り、これは不可能です。また、何も返さない印刷ビジターが必要な場合があるため、これも面倒です。それでも、このテキストでは、ビジターが正しい方法であると主張しています。Java では、Python の柔軟性がなくても実行できることを意味します。信じられないほどハックではない解決策は考えられません-意図した設計について誰かが私に教えてくれますか?