2009-03-23 26 views
7

Necesito escribir un compilador. Es tarea en la universidad. El profesor nos dijo que podemos utilizar cualquier API que deseemos para analizar el código, siempre que sea bueno. De esa forma podemos enfocarnos más en la JVM que generaremos.¿Cómo puedo analizar el código para compilar un compilador en Java?

Así que sí, escribiré un compilador en Java para generar Java.

¿Conoces alguna buena API para esto? ¿Debería usar Regex? Normalmente escribo mis propios analizadores a mano, aunque no es aconsejable en este escenario.

Cualquier ayuda sería apreciada.

+0

No estoy seguro acerca de 1.6, pero hasta 1.4 el analizador para javac en el Sun JDK fue escrito a mano. –

Respuesta

13

Regex es bueno para usar en un compilador, pero solo para reconocer tokens (es decir, sin estructuras recursivas).

La forma clásica de escribir un compilador está teniendo un analizador léxico para los tokens que reconocen, un analizador de sintaxis para el reconocimiento de la estructura, una analizador semántico para el reconocimiento de significado, un generador de código intermedio , un optimizador y, por último, generador de código de destino. Cualquiera de esos pasos se puede combinar, o omitir por completo, si hace que el compilador sea más fácil de escribir.

Se han desarrollado muchas herramientas para ayudar en este proceso. Para Java, se puede ver en

+1

Mmm y mayby ​​un analizador semántico? ¿Para verificar cosas que no se pueden verificar en el analizador? –

+0

En mi opinión, un analizador era una sintaxis y un analizador semántico. He actualizado la respuesta para separar los dos conceptos. –

9

Eche un vistazo a JavaCC, un analizador de lenguaje para Java. Es muy fácil de usar y le da el truco a

10

Recomendaría ANTLR, principalmente debido a sus capacidades de generación de salida a través de StringTemplate.

Lo que es mejor es que Terence Parr's book en el mismo es, con mucho, uno de los mejores libros orientados a escribir compiladores con un generador de analizador.

Luego tiene ANTLRWorks que le permite estudiar y depurar su gramática sobre la marcha.

Para colmo, el ANTLR wiki + documentation, (aunque no lo suficientemente amplio como para que me guste), es un buen lugar para comenzar para cualquier principiante. Me ayudó a actualizar el conocimiento sobre la escritura del compilador en una semana.

2

Tengo usé SableCC en mi curso de compilación, aunque no por elección.

Recuerdo haberlo encontrado muy voluminoso y pesado, con más énfasis en la limpieza que en la comodidad (sin precedencia de operador ni nada, tienes que decirlo en la gramática).

Probablemente querría usar algo más si tuviera la opción. Mis experiencias con yacc (para C) y feliz (para Haskell) han sido agradables.

2

Parser combinators es una buena opción. La implementación Java popular es JParsec.

3

JFlex es un generador de escáner que, según el manual, está diseñado para funcionar con el generador de analizador CUP.

Uno de los principales objetivos de diseño de JFlex era hacer que la interfaz con el generador de analizadores Java CUP sea tan fácil como sea posible [sic].

También tiene support para BYACC/J, que, como su nombre indica, es un puerto de Berkeley YACC para generar código Java.

He usado JFlex y me ha gustado. Sin embargo, el proyecto que estaba haciendo era tan simple que escribí el analizador a mano, por lo que no sé qué tan bueno es CUP o BYACC/J.

1

Le sugiero que consulte la fuente de BeanShell. Tiene un compilador para Java y es bastante simple de leer.

Cuestiones relacionadas