2012-05-05 84 views
6

我正在將Jack Crenshaw的「讓我們編譯一個編譯器」從Turbo Pascal 4.0重寫到JAVA。這是因爲激勵的經典書籍沒有尚未一個O-O版本重寫Crenshaw的「讓我們編譯一個編譯器」的設計模式?

Is there a more modern, OO version of "Let's Build a Compiler"?

這本書包含15章。編譯器以遞增方式呈現:第一章爲整個編譯器提供樣板代碼,然後每章添加一些行到先例章節的Pascal程序。

我已經翻譯的前2章,各章爲包,每個帕斯卡的步驟,JAVA靜態受保護的方法,一個章節的程序都聚集在延伸從其先例章節翻譯類的單個類。

package td1; 
public class Cradle { 
    protected final static char TAB='\t'; 
    protected static char look; 

    protected static void getChar() throws IOException { 
     look=(char) System.in.read(); 
     }  
... 
} 

package td2; 

public class Cradle extends td1.Cradle{ 

    protected static void factor() throws IOException { 
    ... 
    } 

... 
} 

然而,當我來到TD3,我必須更新td2.Cradle的因素(),但我不想在td2.Cradle改變因子(),因爲這將使因素()在td2中做的比它應該在td2中提供的要多。我想到「擴展」td2.Cradle(),但是,似乎不可能擴展一個靜態類。

My related question here

也許我應該改變對非靜態的每一個靜態方法?

我當然需要一些設計模式,任何人都可以幫忙嗎?我希望我很清楚。總之,這個項目遞增地爲每個過程提供越來越多的指導,我希望使用一些像繼承一樣的JAVA機制來記錄中間步驟。

Pascal代碼是經典書籍,在這裏是LBC。我覺得嘗試使用繼承,因爲

  1. 每章的呼叫/平添了幾分更多的行中的先例章規定的程序
  2. 我希望把我的JAVA源代碼可用來大家誰願意跟着LBC一步步。因此,使用單個類來放置作者編譯器的最終源代碼是不合適的。按照Crenshaw的說法,逐個分割代碼並逐漸增加它們是非常重要的。

我的實際解決方案是保持tp1.Cradle的方法爲靜態。在tp2.Cradle,tp3.Cradle,...中,直到tp15.Cradle的方法將是非靜態的,它們全部是靜態導入 tp1.Cradle。*。此外,對於大於2的每個整數i,tp [i] .Cradle 延伸 tp [i-1] .Cradle。

不要猶豫,告訴我更好的解決方案。

+1

您可以添加您嘗試重寫的Pascal代碼嗎?我知道你已經在Pascal的程序中使用了Java靜態方法。從不清楚的問題到我爲什麼要使用繼承。 – Seitaridis

+1

@Seitaridis LBC本身包含pascal代碼,只需按照鏈接... –

回答

1

這聽起來像你在正確的軌道上。爲了能夠覆蓋這些方法,它們應該是實例方法。所以你應該從一個依賴於這些「全局方法」的模型轉移到一個基於實例的模型,在這個模型中創建一個Cradle類的實例,並在該實例上調用適當的方法。

+0

感謝您的回答。我上面更新我的實際解決方案。它可能不是一個優雅的,但它的工作原理。 – zell