tipos sirve que proposito programacion para lenguajes lenguaje general futuro ejemplos definicion clasificacion parsing antlr antlr3 xtext

parsing - proposito - que es python y para que sirve



¿Se puede usar Xtext para analizar lenguajes de programación de propósito general? (5)

Creo que nadie implementó Java o C ++ porque es mucho trabajo (incluso con Xtext) y las herramientas y compiladores existentes son excelentes. Sin embargo, puede echar un vistazo a Xbase y Xtend, que es el lenguaje de expresión que enviamos con Xtext. Está construido con Xtext y es una buena prueba de lo que puede construir con Xtext. Lo hemos hecho en unos 4 meses.

Hice un par de screencasts en Xtend:

http://blog.efftinge.de/2011/03/xtend-screencast-part-1-basics.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-2-switch.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-3-rich-strings-ie.html

Tenga en cuenta que simplemente puede incrustar expresiones Xbase en su idioma.

Actualmente estoy desarrollando un lenguaje de programación basado en agentes de propósito general (su sintaxis estará inspirado de alguna manera en Java, y también estamos usando objetos en este lenguaje).

Desde el inicio del proyecto, teníamos dudas sobre el hecho de usar ANTLR o Xtext . En ese momento descubrimos que Xtext estaba implementando un subconjunto de la característica de ANTLR. Así que decidimos usar ANLTR para nuestro idioma, perdiendo la posibilidad de tener un editor de Eclipse completo de forma gratuita para nuestro idioma (unas características muy buenas proporcionadas por Xtext).

Sin embargo, como lo mejor de mi conocimiento, este verano, el proyecto Xtext ha dado un gran paso adelante . Citando desde el enlace:

¿Cuáles son las limitaciones de Xtext?

Sven: Puedes implementar casi cualquier tipo de lenguaje de programación o DSL con Xtext. Hay una excepción, es decir, si necesita usar los llamados ''Predicados semánticos'', que es una cosa bastante complicada que no creo que valga la pena explicar aquí. Muy pocos idiomas realmente necesitan este concepto. Sin embargo, el ejemplo destacado es C / C ++. Queremos ver ese tema para la próxima versión.

Y eso también se refuerza en la documentación de Xtext :

¿Qué es Xtext? No importa si desea crear un pequeño lenguaje de dominio específico de texto (DSL) o si desea implementar un lenguaje de programación de propósito general completo. Con Xtext puedes crear tus propios idiomas en un instante. Además, si ya tiene un idioma existente pero carece de un soporte de herramientas decente, puede usar Xtext para crear un entorno de desarrollo sofisticado basado en Eclipse que ofrezca una experiencia de edición conocida de los IDE de Java modernos en un tiempo sorprendentemente corto. Llamamos a Xtext un marco de desarrollo de lenguaje.

Si Xtext se ha librado de sus limitaciones anteriores, ¿por qué todavía no es posible encontrar una gramática compleja de Xtext para los mejores lenguajes de programación conocidos (Java, C #, etc.)?

En el sitio web de ANTLR puede encontrar toneladas de tales ejemplos de gramática, por lo que concierne a Xtext, en cambio, la única muestra que pude encontrar es la que aparece en la documentación. Entonces, ¿quizás Xtext aún no está maduro para ser usado para implementar un lenguaje de programación de propósito general? Estoy un poco preocupado por esto ... No empezaría a reescribir la gramática en Xtext para luego reconocer que no era adecuado para eso.


He estado usando Xtext durante dos años para implementar el lenguaje Umple (http://cruise.site.uottawa.ca/umple/). Umple es un lenguaje de modelado de propósito general que permite a los desarrolladores integrar otros lenguajes de programación de alto nivel (como Java y PhP). Por lo tanto, necesito Xtext para poder hacer referencia a la gramática de otros idiomas (es decir, Java). No he podido encontrar la gramática java escrita en Xtext. La gramática de referencias cruzadas es una buena característica, pero no estoy dispuesto a seguir el camino de reescribir la gramática de Java en xtext. Cualquier idea o ayuda es apreciada.


No puedo hablar por lo que Xtext es o hace bien.

Puedo hablar sobre el problema del desarrollo de herramientas robustas para el procesamiento de lenguajes reales, en base a nuestra experiencia con el kit de herramientas de reingeniería de software DMS , que creemos que es un marco de manipulación de lenguaje.

Primero, el análisis de lenguajes reales generalmente involucra algo desordenado en el lexing y / o el análisis, debido a las formas históricas en que estos lenguajes han evolucionado. Java es bastante limpio. C # tiene palabras clave que dependen del contexto y un preprocesador rudimentario parecido a C. C tiene un preprocesador completo. C ++ es famoso como "difícil de analizar" debido a las ambigüedades en la gramática y las travesuras con la sintaxis de la plantilla. COBOL es bastante feo, no tiene ninguna gramática de referencia y viene en una variedad de dialectos. PHP te convertirá en piedra si lo miras porque está muy mal definido. (DMS tiene analizadores para todos estos, utilizados en la ira en aplicaciones reales).

Sin embargo, puedes analizar todo esto con la mayoría de las tecnologías de análisis disponibles si te esfuerzas lo suficiente, generalmente abusando del lexer o del analizador para lograr tus objetivos (cómo los chicos de GNU abusaron de Bison para analizar C ++ al enredar el análisis léxico con la tabla de símbolos) es un buen caso feo en el punto). Pero se requiere mucho esfuerzo para obtener los detalles del idioma, y ​​los manuales de referencia son solo aproximaciones cercanas de la verdad con respecto a lo que realmente aceptan los compiladores.

Si Xtext tiene un motor de análisis decente, es probable que se pueda hacer esto con Xtext. Una breve lectura del sitio de Xtext suena como que los lexers y los analizadores son bastante decentes. No vi nada sobre los "Predicados semánticos"; Los tenemos en DMS y son salvavidas en algunos de los rincones realmente oscuros del análisis. Incluso utilizando la tecnología de análisis realmente buena (usamos analizadores GLR), sería muy difícil analizar las declaraciones de datos COBOL (extraer su estructura de anidación durante el análisis) sin ellas.

Tienes un problema interesante en que tu idioma aún no está bien definido. Eso hará que tus analizadores iniciales sean un poco confusos, y los revisarás mucho. Aquí es donde la sólida tecnología de análisis te ayuda: si puedes revisar tu gramática fácilmente, puedes centrarte en cómo quieres que sea tu idioma, en lugar de concentrarte en luchar contra el analizador y el lexer. El hecho de que pueda cambiar la definición de su idioma significa que, de hecho, si Xtext tiene algunas limitaciones, probablemente pueda doblar la sintaxis de su idioma para que coincida sin grandes dolores. ANTLR tiene la capacidad comprobada de analizar un lenguaje prácticamente como lo imaginas, en forma modular la cantidad habitual de pirateo del analizador.

Lo que nunca se discute es qué más se necesita para procesar un lenguaje de verdad. Lo primero que debe hacer es construir AST, que ANTLR y YACC le ayudarán a hacer; Supongo que Xtext también lo hace. También necesita tablas de símbolos, control y análisis de flujo de datos (tanto local como global), y maquinaria para transformar su idioma en otra cosa (probablemente más ejecutable). Encontrarás tablas de símbolos que encontrarás sorprendentemente difícil; C ++ tiene varios cientos de páginas de "cómo buscar un identificador"; Los genéricos de Java son mucho más difíciles de corregir de lo que cabría esperar. También puede querer imprimir el código AST de nuevo en el código fuente, si desea ofrecer refactorizaciones. (EDITAR: Aquí, tanto ANTLR como Xtext ofrecen lo que equivale a la generación de código impulsado por plantilla de texto).

Sin embargo, estos son mecanismos complejos que llevan tanto tiempo, si no más que la creación del analizador. La razón por la que el DMS existe no es porque pueda analizar (lo vemos como una apuesta inicial en un juego de póquer), sino porque todas estas otras cosas son muy difíciles y queríamos amortizar el costo de hacerlo todo (el DMS tiene, Pensamos, un excelente soporte para todos estos mecanismos, pero YMMV).

Al leer la descripción general de Xtext, parece que tienen algún soporte para las tablas de símbolos, pero no está claro qué tipo de suposición hay detrás (por ejemplo, para C ++ debe admitir herencia múltiple y espacios de nombres).

Si ya has empezado por la carretera ANTLR y tienes algo corriendo, me sentiría tentado a mantener el rumbo; Dudo que Xtext te ofrezca mucha ayuda adicional. Si realmente desea el editor de Xtext, entonces probablemente pueda cambiar al precio de la reestructuración de la gramática que tiene (este es un precio bastante típico al cambiar los paradigmas de análisis). Espere que la mayor parte de su trabajo aparezca después de que obtenga el analizador correctamente, de una manera ad hoc. Dudo que encuentres Xtext o ANTLR muy diferente aquí.


Supongo que la respuesta más simple a su pregunta es: muchos lenguajes de propósito general se pueden implementar utilizando Xtext. Pero como no hay una respuesta general a la que el analizador se adapte a las necesidades de los lenguajes de propósito general, no hay una respuesta general a sus preguntas.

Sin embargo, tengo algunos consejos:

  • Con Xtext 2.0 (lanzado este verano), Xtext admite predicados sintácticos. Esta es una de las funciones más solicitadas para manejar la sintaxis ambigua sin habilitar el seguimiento de antlr.

  • Es posible que desee ver los nuevos lenguajes Xbase y Xtend, que son (basados ​​en sus capacidades) para fines generales y que se desarrollan utilizando Xtext. Sven tiene algunos buenos lanzamientos de pantalla en su blog: http://blog.efftinge.de/

Con respecto a su pregunta de por qué no vemos las gramáticas Xtext para Java, C ++, etc .: Con Xtext, un lenguaje es más que solo una gramática, por lo que tener una gramática que describa la sintaxis de un idioma es un buen punto de partida, pero generalmente no. un artefacto lo suficientemente valioso para el envío. La razón es que con una gramática Xtext usted también define la estructura de AST (árbol de sintaxis abstracta y, de hecho, un modelo Ecore) que incluye referencias cruzadas verdaderas. Dado que este modelo es la principal API interna de su idioma, la gente suele pensar mucho en diseñarlo. Además, para resolver las referencias cruzadas (también conocido como vinculación), es necesario implementar el alcance (como se llama en Xtext). Sin una implementación adecuada del alcance, puede que no tenga referencias cruzadas verdaderas en su modelo o que obtenga muchos errores de alineación.

Supongo que mi punto es que crear una gramática + diseñar el modelo AST + implementar el alcance es solo un poco más de esfuerzo que tomar una gramática de algún zoológico de idiomas y traducirla a la sintaxis de Xtext.

hth, moritz