Jack Crenshaw の「コンパイラを作ろう」を Turbo Pascal 4.0 から JAVA に書き直しています。古典本はまだOO版が出ていないので励みになります
「Let's Build a Compiler」のより現代的な OO バージョンはありますか?
この本には 15 の章が含まれています。コンパイラは段階的に提示されます。第 1 章ではコンパイラ全体のボイラープレート コードを提供し、各章では前の章の Pascal 手順にいくつかの行を追加します。
最初の 2 つの章は既に翻訳済みで、各章はパッケージとして、各 Pascal プロシージャは JAVA の静的保護メソッドとして、1 つの章のプロシージャは、前の章から翻訳されたクラスを拡張する単一のクラスにまとめられています。
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 の factor() を更新する必要がありますが、td2.Cradle で factor() を変更したくありません。 td2 で表示されるはずでした。td2.Cradle()を「拡張」しようと思ったのですが、静的クラスを拡張するのは無理そうです。
たぶん、すべての静的メソッドを非静的メソッドに変更する必要がありますか?
ここには確かにいくつかのデザインパターンが必要です。私がはっきりしていたことを願っています。要約すると、このプロジェクトでは、各手順の手順が徐々に増えていきます。継承などの Java メカニズムを使用して、中間の手順を記録したいと考えています。
The Pascal code is the classic book is here LBC . 継承を使おうとした気がする
- 各章は、前の章で定義された手順にもう少し行を呼び出し/追加します
- 私の Java ソース コードを、LBC を一歩一歩たどりたいすべての人が使えるようにしたいと考えています。そのため、作成者のコンパイラの最終ソース コードに単一のクラスを使用することは適切ではありません。Crenshaw が行ったように、コードを章ごとに分割し、徐々に増やしていくことが不可欠です。
私の実際の解決策は、tp1.Cradle のメソッドを静的に保つことです。tp2.Cradle、tp3.Cradle、...、tp15.Cradle までのメソッドは非静的になり、すべて静的にtp1.Cradle.*をインポートします。さらに、2 より大きいすべての整数 i について、tp[i].Cradleはtp[i-1].Cradle を拡張します。
ためらわずに、より良い解決策を教えてください。