2012-05-05 10 views
6

Sto riscrivendo "costruiamo un compilatore" di Jack Crenshaw da Turbo Pascal 4.0 a JAVA. Questo è motivante perché il classico libro non ha ancora un O-O versioneDesign pattern per riscrivere Crenshaw's "costruiamo un compilatore"?

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

Il libro contiene 15 capitoli. Il compilatore viene presentato in modo incrementale: il capitolo I fornisce i codici di riferimento per l'intero compilatore, quindi ogni capitolo aggiunge alcune linee alle procedure Pascal del capitolo precedente.

Ho già tradotto i primi 2 capitoli, ogni capitolo come un pacchetto, ogni procedura Pascal come metodo protetto statico in JAVA, le procedure di un capitolo sono raccolte in una singola classe che estende la classe tradotta dal suo capitolo precedente .

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

... 
} 

Tuttavia, quando vengo a TD3, devo aggiornare il fattore() di td2.Cradle, ma io non voglio cambiare in td2.Cradle il fattore(), perché questo renderà il fattore() in td2 fare più di quello che avrebbe dovuto presentare in td2. Ho pensato di "estendere" td2.Cradle(), tuttavia, sembra impossibile estendere una classe statica.

My related question here

Forse dovrei cambiare ogni metodo statico a uno non statico?

Ho certamente bisogno di qualche schema di progettazione qui, qualcuno può aiutare? Spero di essere stato chiaro. In sintesi, questo progetto presenta sempre più istruzioni per ogni procedura e spero di registrare i passaggi intermedi utilizzando un meccanismo JAVA come ereditarietà.

Il codice Pascal è il classico libro è qui LBC. Mi sento tentato di utilizzare l'ereditarietà, perché

  1. chiamate ogni capitolo/aggiunge un po 'più linee le modalità definite nei capitoli precedenti
  2. spero di fare il mio codice sorgente di Java utilizzabile per tutti coloro che vogliono seguire LBC passo passo. Quindi non è appropriato usare una singola classe per inserire il codice sorgente finale del compilatore dell'autore. È essenziale dividere i codici per capitoli e incrementarli gradualmente come ha fatto Crenshaw.

La mia soluzione effettiva è mantenere i metodi di tp1.Cradle come statici. I metodi in tp2.Cradle, tp3.Cradle, ..., fino a quando tp15.Cradle sarà non statico e tutti importano staticamente tp1.Cradle. *. Inoltre, per ogni intero i maggiore di 2, tp [i] .Cample estende tp [i-1] .Cradle.

Non esitate a dirmi soluzione migliore.

+1

È possibile aggiungere il codice Pascal che si sta tentando di riscrivere? Capisco che tu abbia usato metodi statici Java per le procedure in Pascal. Dalle domande non mi è chiaro perché vuoi usare l'ereditarietà. – Seitaridis

+1

@Seitaridis LBC stesso contiene il codice Pascal, basta seguire i collegamenti ... –

risposta

1

Sembra che tu sia sulla strada giusta. Per poter eseguire l'override di questi metodi, dovrebbero essere metodi di istanza. Pertanto, è necessario spostarsi da un modello che si basa su questi "metodi globali" a un modello basato su istanze, in cui creare un'istanza della classe Cradle e chiamare i metodi appropriati su tale istanza.

+0

Grazie per questa risposta.Aggiorna la mia soluzione attuale sopra. Potrebbe non essere elegante, ma funziona. – zell