2011-11-26 29 views
9

Quiero convertir una gramática Antlr muy simple a Xtext, por lo que no syntactic predicates, no fancy features of Antlr not provided by Xtext. Considere esta gramáticaConvertir la gramática Antlr simple a Xtext

grammar simple; // Antlr3 

foo: number+; 
number: NUMBER; 
NUMBER: '0'..'9'+; 

y su contraparte xtext

grammar Simple; // Xtext 
import "http://www.eclipse.org/emf/2002/Ecore" as ecore 
generate Simple "http://www.example.org/Simple" 

Foo: dummy=Number+; 
Number: NUMBER_TOKEN; 
terminal NUMBER_TOKEN: '0'..'9'+; 

xtext utiliza Antlr detrás de las escenas, pero el formato de dos no son exactamente lo mismo. Hay algunas cosas bastante molesto (y en parte comprensibles) que tengo que modificar, entre ellos:

  • terminales de prefijo con la palabra clave terminal
  • import "http://www.eclipse.org/emf/2002/Ecore" as ecore Incluir también para hacer terminales funcionan
  • agregar una función a la parte superior- regla de nivel, por ejemplo foo: dummy=number+
  • Tenga en cuenta que las reglas y los nombres de los terminales deben ser únicos, incluso sin distinción entre mayúsculas y minúsculas.
  • Opcionalmente, escriba en mayúscula la primera letra de los nombres de las reglas para seguir la convención de Java.

¿Existe alguna herramienta para realizar esta conversión automáticamente al menos en casos simples? Si no, ¿hay una lista de verificación más completa de tales modificaciones requeridas?

+0

No conoces ninguna herramienta que haga exactamente lo que quieres, pero podrías [convertir] (http://bottlecaps.de/convert/) la gramática a XML y luego ejecutar XQuery o XSLT en el resultado para transformar al formato de destino deseado. El convertidor solo entiende la estructura básica de una gramática ANTLR, pero eso es lo que usted solicitó. – Gunther

+0

@BartKiers y Gunther, les agradezco a ambos por su ayuda, pero esta conversación parece desviarse del tema. Gunther, es posible que tenga un rastreador de problemas para su convertidor (que también uso, con mucho gusto), por lo que puede continuar allí. –

+1

@ AdamSchmideg, tienes razón, no fue del todo sobre el tema, pero comenzó con un comentario que estaba en el tema: para ser sincero, creo que eres un poco riguroso. Pero es justo, es tu pregunta, así que eliminaré mi ruido. Mis disculpas. @Gunther, intenté explicar el uso del carácter '~' en esta sección de preguntas y respuestas: http://stackoverflow.com/questions/8284919/negating-inside-lexer-and-parser-rules –

Respuesta

3

Básicamente no es posible realizar esta conversión automáticamente ya que la gramática Antlr carece de la información que se requiere en la gramática Xtext. Los nombres de las reglas en Xtext se usarán para crear clases a partir de ellos. Hay asignaciones en Xtext que se convertirán en getters y setters en esas clases. Sin embargo, estas asignaciones no se deben usar para cada llamada de regla ya que hay patrones especiales en Xtext que permiten reducir el ruido en el AST resultante. Cosas así hacen que sea casi imposible hacer esta transformación de forma automática. Sin embargo, normalmente es sencillo copiar la gramática Antlr en el editor de Xtext y corregir los problemas de forma manual.

+1

Solucionar el problema manualmente puede significar mucho trabajo, porque Xtext me obliga a pensar en el AST mientras que Antlr está contento con un descuidado, "simplemente analice y no haga preocuparse por el enfoque AST ". –

Cuestiones relacionadas