Шаблон проектирования для переписывания Crenshaw's #39;s «позволим& #39;s построить компилятор»?

Я переписываю Джека Креншоу «давайте создадим компилятор» с Turbo Pascal 4.0 на JAVA. Это мотивирует, потому что у классической книги еще нет О -О-версии

. Есть ли более современная ОО-версия «Let& #39;s Build a Compiler»?

Книга содержит 15 глав. Компилятор представлен поэтапно. :Глава I содержит шаблоны кода для всего компилятора, затем каждая глава добавляет несколько строк к процедурам Pascal из предыдущей главы.

Я уже перевел первые 2 главы, каждая глава как пакет, каждая процедура Pascal как статический защищенный метод в 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, такой как наследование.

Код Паскаля — классическая книга находится здесь ББК . Я чувствую попытку использовать наследование, потому что

  1. Каждая глава вызывает/добавляет немного больше строк к процедурам, определенным в предшествующих главах
  2. Я надеюсь сделать мой исходный код JAVA доступным для всех, кто хочет шаг за шагом следовать LBC. Поэтому нецелесообразно использовать один класс для окончательного исходного кода авторского компилятора. Очень важно разделить коды на главы и постепенно увеличивать их, как это делал Креншоу.

Мое реальное решение состоит в том, чтобы оставить методы tp1.Cradle как статические. Методы в tp2.Cradle, tp3.Cradle,... до tp15.Cradle не будут -статическими, и все они статически импортируют tp1.Cradle. *. Более того, для каждого целого числа i, большего 2, tp[i].Cradle расширяет tp[i -1].Cradle.

Не стесняйтесь, подскажите лучшее решение.

6
задан Community 23 May 2017 в 12:24
поделиться