2012-07-17 18 views
5

Tengo un lenguaje específico de dominio que se puede traducir a SQL. ¿Debo escribir mi propio lexer, analizador y generador de código, o hay herramientas que podrían ayudarme?¿Herramienta correcta para traducir un DSL a SQL?

+0

¿Piensas analizar la sintaxis del lenguaje específico de tu dominio en SQL también? – alexm

+1

Permítanme reformular: ¿Cuál es el lenguaje de host que haría la generación de SQL? – alexm

+0

Realmente depende del idioma que estés usando y cuán complejo sea tu DSL. –

Respuesta

0

Suena como si estuviera buscando algo como Eli, que se destina a aceptar una especificación y generar un traductor de ella:

http://eli-project.sourceforge.net/

Por otro lado, es posible ser tan feliz escribiendo su analizador sintáctico con una buena herramienta de generación como ANTLR y codificando el AST y el generador de código usted mismo.

La generación de código que escribe un lenguaje de alto nivel como SQL probablemente no sea muy difícil de implementar, suponiendo que la traducción desde su DSL es sencilla.

Si fuera yo, escribiría la cosa en OCaml usando ocamllex y ocamlyacc, pero para eso primero necesita saber OCaml.

1

Esto depende en gran medida del idioma que utilizará, pero Groovy, Ruby, Scala, F # y Haskell son buenos idiomas para hacerlo.

El idioma que use afectará las herramientas que también debería usar.

Puede hacer esto en C, por ejemplo, pero sería más trabajo y puede que no se vea tan bien para el usuario.

Algunos idiomas necesitarás usar herramientas para ayudar con el analizador, otros son mejores sin las herramientas.

Le recomendamos leer este libro para obtener más información sobre DSL, DSL en acción.

http://manning.com/ghosh/

1

Si su DSL está diseñado para facilitar la lectura por el codificador de DSL, entonces sí, se necesita un analizador léxico, un analizador y un generador de código.

(Otras respuestas sugieren que si codifica la DSL "en la sintaxis de su 'metalenguaje'" no necesita estos mechansims; mientras que eso puede ser cierto, optimiza para la incorporación de la DSL en la meta- idioma en lugar de su legibilidad para los usuarios finales, lo que creo que es un mal intercambio).

No, no tiene que escribirlos desde cero.

Hay muchos generadores de analizadores en la naturaleza (YACC, Bison, ANTLR, JavaCC) que le ayudarán a concentrarse en la codificación de las reglas gramaticales de su DSL; proporcionan una gran cantidad de maquinaria de análisis de bajo nivel para procesar/ejecutar sus reglas de gramática como motor de análisis sintáctico. Aún así, debe esforzarse para flexibilizar su gramática conceptual a las limitaciones del generador del analizador en particular (LALR (1), LL (k), ...) ANTLR/Bison/Yacc lo ayudará a construir árboles; tienes que hacer un trabajo explícito para hacer esto. Después de eso, estás solo con los analizadores tradicionales. La mayoría de las personas terminan sorprendidas una vez que llegan allí (si llegan hasta aquí, los analizadores de lenguajes reales tienden a tener más trabajo de lo que esperan.

Eso es porque hay un montón de Life After Parsing: tablas de símbolos, análisis de código , generación de código. Nuestro DMS Software Reengineering Toolkit está diseñado para ayudarlo a construir reglas de análisis con restricciones mínimas del motor de gramática, construye automáticamente árboles (¡mire, no, manos!) y proporciona una gran cantidad de soporte para la transformación de códigos en una amplia variedad de formas.Además, DMS proporciona una perspectiva y herramientas para admitir la conversión entre fragmentos de DSL ("su idioma") y el objetivo de forma estructurada utilizando los pares de patrones de origen/destino para especificar el mapeo. Para el propósito específico de OP, DMS se puede obtener con una gramática SQL2011, que proporciona una línea de base agradable para escribir los patrones objetivo.

Para leer más acerca de la conversión automática con herramientas, vea mi SO discussion on translating between languages.

0

No necesita un lexer, un analizador y un generador de código si está utilizando un metalenguaje adecuado (por ejemplo, Lisp). Todo ya está incluido: puedes construir tu DSL sobre expresiones S, puedes generar una parte de host de tu código en Lisp.

Incluso si desea una sintaxis especial para su DSL, es muy fácil integrar un analizador en un metalenguaje.

2

Quizás desee leer este libro: Language Implementation Patterns por Terence Parr de la serie The Pragmatic Programmers. Es una introducción completa al análisis sintáctico, la traducción y la compilación. Se basa en gran medida en ANTLR by Terence Parr para obtener ejemplos, pero es lo suficientemente general como para ponerlo en funcionamiento en otros idiomas y sistemas.

0

Tengo un proyecto similar al suyo. Creo que deberías echar un vistazo a Xtext y Xtend, ya que se pueden usar directamente en Eclipse, puedes obtener fácilmente intellisense, grammer, lexer. Traté de producir código SQL y ha sido un proyecto exitoso hasta ahora.

Cuestiones relacionadas