(免責聲明:這些例子是在構建編譯器的情況下給出的,但這個問題都是關於訪問者模式,並且不需要任何編譯器理論知識。)我正在通過Andrew Appel的現代編譯器在Java中的實現嘗試自學習編譯器理論(所以不,這不是家庭作業),而且我很難理解他希望如何使用Visitor模式將AST轉換爲IR樹。 (注意:我在Python中這樣做,所以我也可以學習Python,這就是爲什麼即將到來的示例不在Java中。)據我所知,Visitor模式中的訪問和接受方法是無效設計的,所以,如果我有像使用訪問者模式的樹轉換
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))
訪問者方法,將兩個子表達式轉換成紅外線,然後將它們與BINOP連接起來代表加號表達。當然,這是不可能的,除非我修改所有的接受函數來返回額外的信息,這也是一團糟,因爲有時你只是想要一個不返回任何東西的打印訪問者。然而,這篇文章堅持說訪問者是正確的路,而在Java中,這意味着它可以在沒有Python靈活性的情況下完成。我想不出任何不是非常難以理解的解決方案 - 任何人都可以點亮我的預期設計?
哎我也想研究編譯器...那本書是研究編譯器的好書嗎? – 2009-12-14 04:58:01
我認爲這是一個很好的介紹。它會引導您(而不是牽着你的手)執行一個編譯器,該編譯器將Java的一個子集作爲源併發布本地代碼。它還包含編譯器理論中的一系列高級主題。 – danben 2009-12-14 05:05:35
它是否包含代碼生成部分? – 2009-12-14 05:15:50