2010-02-04 20 views
18

Estoy trabajando en una DSL bastante compleja que quiero compilar en algunos idiomas de alto nivel. Todo el proceso ha sido una experiencia de aprendizaje. El compilador está escrito en java.¿El mejor diseño para generar código de un AST?

Me preguntaba si alguien sabía una mejor práctica para el diseño de la parte generador de código. Actualmente tengo todo analizado en un árbol de sintaxis abstracta.

Yo estaba pensando en usar un sistema de plantillas, pero no he investigado esa dirección demasiado sin embargo, como me gustaría escuchar algo de sabiduría en primer lugar de desbordamiento de pila.

Gracias!

+1

Tal vez sea solo porque lo pidió hace mucho tiempo. Pero a partir de hoy (2013), ANTLR (que parece estar usando) tiene "plantillas de cadena" incorporadas. –

Respuesta

8

Cuando estaba haciendo esto en mi clase de lenguajes de programación, terminamos usando emisores basados ​​en el siguiente patrón Visitor. Funcionó bastante bien: hace que reorientarlo a nuevos lenguajes de salida sea bastante fácil, siempre y cuando su AST coincida con lo que está imprimiendo bastante bien.

+0

Gracias por la idea. Estoy familiarizado con el patrón Visitor. Lo uso para optimizar expresiones literales en el árbol. –

+0

No afirma que no está familiarizado con él, simplemente sugiriendo que podría terminar haciendo un buen generador de código también :-) –

+0

Sí, no quise decir eso para sonar presumido. Estoy investigando ahora, gracias. :) –

-1

DSL es una buena cosa. Y escribirlos es una buena práctica.

Pero no estoy seguro de que la implementación de su propio YACC y similares sea una buena opción en 2010, a menos que sea solo por diversión o educativo.

Cuando termine su proceso educativo y comience a buscar una forma agradable de implementar sus DSL, puede considerar el uso de lenguajes dinámicos.

Al usar Groovy, por ejemplo, puede implementar sus pequeñas y grandes DSL de una forma muy fácil y agradable.
BTW Groovy ha incorporado la aplicación de manipulación AST.

+0

Creo que has malentendido. Estoy usando un generador de analizador ya para generar el AST. Estoy usando ANTLR3 y tengo el árbol construido. Estoy buscando la mejor manera de convertir ese árbol de nuevo en código en otro lenguaje de alto nivel. Gracias. –

6

Lo que realmente quiere es un program transformation system, que mapea las estructuras de sintaxis en un idioma (su DSL) en patrones de sintaxis en otros lenguajes. Dicha herramienta puede llevar a cabo transformaciones arbitrarias (reescrituras de árbol generalizan reescrituras de cadena que son sistemas Post que son capaces de soportar Turing) durante el proyecto de generación de código, lo que significa que lo que generas y lo sofisticado tu proceso de generación está determinado solo por tu ambición , no por las propiedades de "framework generador de código".

Los sofisticados sistemas de transformación de programas combinan diversos tipos de análisis de alcance, análisis de flujo y/o analizadores personalizados para permitir las transformaciones. Esto no agrega ningún poder teórico, pero agrega mucho poder práctico: la mayoría de los lenguajes reales (incluso DSL) tienen espacios de nombres, control y flujo de datos, necesitan inferencia tipo, etc. etc.

Nuestro DMS Software Reengineering Toolkit es este tipo del sistema de transformación. Se ha utilizado para analizar/transformar tanto los lenguajes convencionales como los DSL, para lenguajes simples y complejos, y para sistemas de software pequeños, grandes e incluso grandes.

Relacionado con los comentarios de OP sobre "turning the AST into other languages", that is accomplished by DMS by writing transformations that map surface syntax for the DSL (implemented behind the scenes his DSL's AST) to surface syntax for the target language (implementado utilizando AST de idioma de destino). A continuación, DMS imprime automáticamente la lengua de destino objetivo resultante para proporcionar el código fuente real en el idioma de destino, que corresponde al AST de destino.

3

Si ya está utilizando antlr y tiene su AST listo es posible que desee echar un vistazo a StringTemplate: http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

también la sección 9.6 de El antlr definitivo Referencia: Idiomas Edificio de dominio-específicas explica esto: http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

Los ejemplos de código libre están disponibles en http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz. En el código de la subcarpeta \ templates \ generator \ 2pass \ encontrará un ejemplo de conversión de expresiones matemáticas a bytecode java.

Cuestiones relacionadas