2012-05-05 13 views
6

Przepisuję "let's build a compiler" Jacka Crenshawa z Turbo Pascal 4.0 na JAVA. To jest motywujące, ponieważ klasyczny książka nie ma jeszcze O-O WersjaWzór do przepisywania "zbudujmy kompilator" Crenshawa?

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

Książka zawiera 15 rozdziałów. Kompilator jest przedstawiony w sposób przyrostowy: Rozdział I podaje kody dla całego kompilatora, a następnie każdy rozdział dodaje kilka linii do procedur Pascala z poprzedniego rozdziału.

Już przetłumaczyłem pierwsze 2 rozdziały, każdy rozdział w pakiecie, każda procedura Pascala jako statyczna metoda chroniona w JAVA, procedury jednego rozdziału są zebrane w jednej klasie, która rozszerza klasę przetłumaczoną z jej poprzedniego rozdziału .

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 { 
    ... 
    } 

... 
} 

Jednak, kiedy przychodzą do TD3, muszę zaktualizować współczynnik() z td2.Cradle, ale nie chcę, aby zmienić w td2.Cradle współczynnik(), bo to sprawi, że współczynnik() w td2 robi więcej, niż powinien prezentować w td2. Myślałem o "rozszerzeniu" td2.Cradle(), jednak wydaje się niemożliwe rozszerzenie klasy statycznej.

My related question here

Może powinienem zmienić każdą metodę statyczną do jednego non-statycznej?

Ja na pewno potrzebuję jakiegoś wzoru wzoru tutaj, ktoś może pomóc? Mam nadzieję, że było jasne. Podsumowując, ten projekt stopniowo przedstawia coraz więcej instrukcji dla każdej procedury i mam nadzieję zapisywać pośrednie kroki, używając jakiegoś mechanizmu JAVA, takiego jak dziedziczenie.

Kod Pascala to klasyczna książka pod tym numerem: LBC. Czuję próbował użyć dziedziczenia ponieważ

  1. wzywa każdego rozdziału/dodaje nieco więcej linii z procedurami określonymi w rozdziałach zawieszających
  2. Mam nadzieję, że mój kod źródłowy Java nadające się do każdego, kto chce pójść krok LBC przez krok. Więc nie jest właściwe używanie jednej klasy do umieszczenia ostatecznego kodu źródłowego autorskiego kompilatora. Istotne jest podzielenie kodów na rozdziały i stopniowe ich zwiększanie, tak jak robiła to Crenshaw.

Moim rzeczywistym rozwiązaniem jest utrzymanie metod tp1.Cradle jako statycznych. Metody w tp2.Cradle, tp3.Cradle, ..., dopóki tp15.Cradle nie będą statyczne, a wszystkie one statycznie importują tp1.Cradle. *. Ponadto, dla każdej liczby całkowitej i większej niż 2, tp [i] .Carple rozszerza tp [i-1] .Cradle.

Nie wahaj się powiedzieć mi lepsze rozwiązanie.

+1

Czy możesz dodać kod Pascala, który próbujesz przepisać? Rozumiem, że użyłeś metod statycznych Java do procedur w Pascalu. Od pytań nie jest dla mnie jasne, dlaczego chcesz korzystać z dziedziczenia. – Seitaridis

+1

@Seitaridis LBC sam zawiera kod pascalowy, wystarczy postępować zgodnie z linkami ... –

Odpowiedz

1

Wygląda na to, że jesteś na dobrej drodze. Aby móc zastąpić te metody, powinny to być metody instancji. I dlatego powinieneś odejść od modelu, który opiera się na tych "metodach globalnych", do modelu opartego na instancji, w którym tworzysz instancję klasy Cradle i wywołujesz odpowiednie metody na tej instancji.

+0

Dziękuję za tę odpowiedź.Zaktualizuję moje aktualne rozwiązanie powyżej. To może nie być eleganckie, ale działa. – zell

Powiązane problemy