我正在將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(),但是,似乎不可能擴展一個靜態類。
也許我應該改變對非靜態的每一個靜態方法?
我當然需要一些設計模式,任何人都可以幫忙嗎?我希望我很清楚。總之,這個項目遞增地爲每個過程提供越來越多的指導,我希望使用一些像繼承一樣的JAVA機制來記錄中間步驟。
Pascal代碼是經典書籍,在這裏是LBC。我覺得嘗試使用繼承,因爲
- 每章的呼叫/平添了幾分更多的行中的先例章規定的程序
- 我希望把我的JAVA源代碼可用來大家誰願意跟着LBC一步步。因此,使用單個類來放置作者編譯器的最終源代碼是不合適的。按照Crenshaw的說法,逐個分割代碼並逐漸增加它們是非常重要的。
我的實際解決方案是保持tp1.Cradle的方法爲靜態。在tp2.Cradle,tp3.Cradle,...中,直到tp15.Cradle的方法將是非靜態的,它們全部是靜態導入 tp1.Cradle。*。此外,對於大於2的每個整數i,tp [i] .Cradle 延伸 tp [i-1] .Cradle。
不要猶豫,告訴我更好的解決方案。
您可以添加您嘗試重寫的Pascal代碼嗎?我知道你已經在Pascal的程序中使用了Java靜態方法。從不清楚的問題到我爲什麼要使用繼承。 – Seitaridis
@Seitaridis LBC本身包含pascal代碼,只需按照鏈接... –