Pregunta

¿Qué herramientas tengo a mi disposición para construir un DSL externo real y honesto?Y no, no estoy hablando de abusar de Ruby, Boo, XML u otro lenguaje o sintaxis existente, me refiero a un DSL externo REAL: mi propio lenguaje para mis propios fines.

Sé que se están desarrollando algunos bancos de trabajo de lenguajes y he oído hablar de cosas como "Irony" para .NET.Y, por supuesto, están ANTLR, Lex/Yaac, etc., pero me temo que son demasiado complicados para lo que estoy tratando de hacer.

Hable sobre una herramienta de creación de DSL que haya utilizado o de la que haya oído hablar y sus impresiones sobre cómo ayuda y cuáles son sus desventajas.

¿Fue útil?

Solución

He escrito DSL en Boo, Irony.NET y un conjunto de herramientas llamado Grammatica.Usted dice que un analizador-generador es demasiado complicado, pero puede que se esté apresurando demasiado a su juicio; de hecho, son bastante sencillos de usar una vez que supera una pequeña curva de aprendizaje y abren un vasto mundo de posibilidades que anula fácilmente el esfuerzo.Descubrí que aprender la notación necesaria para escribir gramáticas para la mayoría de los generadores de analizadores es algo similar a aprender expresiones regulares: tienes que inclinar un poco la mente para dejarlas entrar, pero las recompensas son significativas.

Mi opinión es esta:Si su idioma de destino es lo suficientemente simple como para que un diseñador visual tonto pueda manejarlo, entonces escribir una gramática usando un generador de analizador debería ser bastante fácil.

Si su DSL objetivo es lo suficientemente complicado como para necesitar sudar escribiendo una gramática, entonces la tonta herramienta visual no será suficiente de todos modos y terminará teniendo que aprender a escribir una gramática de todos modos.

Sin embargo, a largo plazo estoy de acuerdo entre los DSL internos y externos.Escribí un DSL interno en Boo y tuve que modificar mi sintaxis DSL para que funcionara, y siempre me pareció un truco.La misma gramática usando Irony.NET o ANTLR habría sido igual de fácil de lograr con más flexibilidad.

tengo un entrada en el blog discutiendo algunas opciones.La publicación se centra en escribir un DSL para la evaluación de expresiones en tiempo de ejecución, pero las herramientas son todas iguales.

Mi experiencia con Irony.NET ha sido totalmente positiva y hay varios lenguajes de referencia implementados con él, lo cual es un buen punto de partida.Si su lenguaje es simple, no será nada complicado ponerlo en marcha.También hay una biblioteca en CodeProject llamada TinyParser; esta es realmente interesante porque genera el analizador como código fuente puro, lo que significa que su producto final está completamente libre de referencias de terceros.Aunque yo no lo he usado.

Otros consejos

Si está pensando en escribir DSL independientes, entonces está pensando en crear compiladores, no hay forma de evitarlo.Construcción del compilador es Conocimientos esenciales de programación, y en realidad no es tan difícil como comúnmente se piensa.Steve Yegge Comida de programador adecuado resume bastante bien el valor de saber cómo construir compiladores.

Hay muchas maneras de empezar.Recomiendo consultar los 2 artículos mencionados en el artículo: ¿Quieres escribir un compilador?Simplemente lea estos dos artículos..El primero, Construyamos un compilador, es muy accesible.Utiliza Turbo Pascal como lenguaje de implementación, pero puedes implementarlo fácilmente en cualquier otro idioma; el código fuente es muy claro.Pascal es un lenguaje simple.

Una vez que tengas una buena idea de cómo funcionan las cosas y la terminología involucrada, te recomiendo profundizar en algo como antlr.ANTLR tiene un buen IDE, ANTLRTrabaja, que viene con un intérprete y un depurador.También produce visualizaciones realmente buenas de tus gramáticas sobre la marcha.Lo encontré invaluable en el aprendizaje.

ANTLR tiene varios tutoriales buenos, aunque pueden resultar un poco abrumadores al principio. Éste es bueno, aunque va en contra de ANTLR 2.0, por lo que podrías encontrarte con incompatibilidades con una versión más reciente (actualmente la última es 3.1).

Finalmente, existe otro enfoque para los DSL:El enfoque Lisp.Dada la naturaleza sin sintaxis de Lisp (su código son básicamente árboles de sintaxis abstractos), puede crear infinitos lenguajes a partir de él, siempre que se acostumbre a los paréntesis :).

Si opta por ese enfoque, querrá utilizar un Lisp integrable.En Java, tienes Clojure, un dialecto Lisp que interopera perfectamente con JVM y sus bibliotecas.No lo he usado personalmente, pero se ve bien.Para Scheme, está GNU Engaño, cual es con licencia LGPL.Para Common Lisp, hay ECL, también bajo la LGPL.Ambos utilizan una interfaz C para interoperabilidad, por lo que prácticamente puedes integrarlos en cualquier otro lenguaje.ECL es único entre Lisp en el sentido de que cada función Lisp se implementa como una función C, por lo que puede escribir código Lisp en C si lo desea (por ejemplo, dentro de sus propios métodos de extensión; puede crear funciones C que operen en objetos Lisp, y luego llamarlos desde Lisp).He estado usando ECL para un proyecto paralelo durante un tiempo y me gusta.El mantenedor es bastante activo y receptivo.

Realmente deberías echar un vistazo ragel.Es un marco para incorporar máquinas de estado en su código fuente habitual.Ragel admite C, C++, Objective-C, D, Java y Ruby.

Ragel es excelente para escribir analizadores de archivos y protocolos, así como para revisar archivos DSL externos.Principalmente porque le permite ejecutar cualquier tipo de código en transiciones de estado y demás.

Un par de proyectos notables que utilizan Ragel son, Mestizo, un gran servidor web Ruby.Y albaricoque, un analizador html basado en Ruby, algo inspirado en jQuery.

Otra gran característica de Ragel es cómo puede generar graficar-Gráficos basados ​​en que visualizan sus máquinas de estado.A continuación se muestra un ejemplo tomado de Zed Shaw's artículo sobre gráficos estatales ragel.

ragel state chart

Xtexto fue construido para esto.

Desde el sitio web:

XText es un marco para el desarrollo de lenguajes de programación y lenguajes específicos de dominio.

Cubre todos los aspectos de una infraestructura de lenguaje completa, desde analizadores, sobre enlazador, compilador o intérprete hasta integración IDE de eclipse de primer nivel totalmente soportada.Viene con buenos valores predeterminados para todos estos aspectos y, al mismo tiempo, cada aspecto se puede adaptar a sus necesidades.

He estado usando Irony con buenos resultados.Lo mejor de la ironía es que puedes incluirla fácilmente en cualquier tiempo de ejecución en el que vayas a utilizar DSL.Estoy creando un DSL externo que incluyo en un modelo semántico escrito en C#, por lo que la ironía es genial.Luego uso el modelo semántico para generar código con StringTemplate.

Si planea implementar un DSL externo, Spoofax ( http://strategoxt.org/Spoofax ) es un buen banco de trabajo de idiomas para hacer esto.Es un Langauge Workbench textual basado en analizador que aprovecha varias tecnologías de última generación, como SDF y Stratego.Además de la implementación de DSL, puede obtener servicios de edición muy completos, como finalización de código, vista de esquema, intellisense, etc.Se ha utilizado para construir varios lenguajes, p. http://mobl-lang.org/.Consulte esto para tener una idea sobre el soporte brindado.

El proyecto Spoofax viene con una buena implementación DSL de muestra lista para usar y un generador de código Java.Puede funcionar como punto de partida para empezar a utilizar las herramientas.

Los siguientes detalles del tutorial sobre el uso de este banco de trabajo de idiomas: http://strategoxt.org/Spoofax/Tour.

¡Espero eso ayude!

Para DSL externos serios, no se puede evitar el problema de análisis;ANTLR es lo mínimo que necesitas.Lo que desea verificar son los sistemas de transformación de programas, que pueden usarse para asignar sintaxis DSL arbitraria a lenguajes de destino como Java.

Ver http://en.wikipedia.org/wiki/Program_transformation

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top