2012-05-05 17 views
6

Estoy reescribiendo el "compilador de compilación" de Jack Crenshaw de Turbo Pascal 4.0 a JAVA. Esto es motivador porque el libro clásico no tiene todavía una versión OOPatrón de diseño para reescribir "compilamos un compilador" de Crenshaw?

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

El libro contiene 15 capítulos. El compilador se presenta de forma incremental: el Capítulo I proporciona los códigos repetitivos para todo el compilador, luego cada capítulo agrega algunas líneas a los procedimientos de Pascal del capítulo precedente.

Ya he traducido los primeros 2 capítulos, cada capítulo como un paquete, cada procedimiento de Pascal como método estático protegido en JAVA, los procedimientos de un capítulo se recopilan en una única clase que amplía la clase traducida del capítulo anterior .

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

... 
} 

Sin embargo, cuando llegue a TD3, tengo que actualizar el factor() de td2.Cradle, pero no quiero cambiar en td2.Cradle el factor(), porque eso hará que el factor() en td2 hace más de lo que debería haber presentado en td2. Pensé en "extender" td2.Cradle(), sin embargo, parece imposible extender una clase estática.

My related question here

Tal vez debo cambiar cada método estático a uno no estático?

Ciertamente necesito un patrón de diseño aquí, cualquiera puede ayudar? Espero haber sido claro. En resumen, este proyecto presenta incrementalmente más y más instrucciones para cada procedimiento y espero registrar los pasos intermedios usando algún mecanismo JAVA como herencia.

El código de Pascal es el libro clásico está aquí LBC. Me siento tratado de utilizar la herencia, porque

  1. cada capítulo llamadas/añade un poco más líneas a los procedimientos definidos en los capítulos precedentes
  2. espero hacer mi código fuente de Java útil para todos aquellos que deseen seguir paso LBC por paso. Por lo tanto, no es apropiado usar una sola clase para incluir el código fuente final del compilador del autor. Es esencial dividir los códigos por capítulos e incrementarlos gradualmente como lo hizo Crenshaw.

Mi solución real es mantener los métodos de tp1.Cradle como estáticos. Los métodos en tp2.Cradle, tp3.Cradle, ..., hasta tp15.Cradle no serán estáticos, y todos importan estáticamente tp1.Cradle. *. Además, para cada entero i mayor que 2, tp [i] .Cradle extiende tp [i-1] .Cradle.

No dude en decirme mejor solución.

+1

¿Puedes agregar el código Pascal que estás intentando reescribir? Entiendo que ha utilizado métodos estáticos de Java para los procedimientos en Pascal. De las preguntas que no están claras para mí, ¿por qué quieres usar la herencia? – Seitaridis

+1

@Seitaridis LBC en sí contiene el código pascal, solo sigue los enlaces ... –

Respuesta

1

Parece que está en el camino correcto. Para poder anular estos métodos, deben ser métodos de instancia. Por lo tanto, debe alejarse de un modelo que se basa en estos "métodos globales", a un modelo basado en instancia, donde crea una instancia de la clase Cradle y llama a los métodos apropiados en esa instancia.

+0

Gracias por esta respuesta.Actualizo mi solución actual arriba. Puede que no sea elegante, pero funciona. – zell