¿Hay un generador de analizadores que también implemente la dirección inversa, es decir, analice objetos de dominio (por ejemplo, impresión bonita) de la misma especificación de gramática? Hasta donde yo sé, ANTLR no es compatible con esto.Generador unparser/analizador combinado
Respuesta
No es posible en general.
¿Qué hace que una impresión sea bonita? Una impresión es bonita, si los espacios, pestañas o líneas nuevas están en esas posiciones, lo que hace que la impresión se vea bien.
Pero la mayoría de las gramáticas ignoran los espacios en blanco, porque en la mayoría de los idiomas, los espacios en blanco no son significativos. Existen excepciones como Python, pero en general la pregunta, si es una buena idea usar espacios en blanco como sintaxis, sigue siendo controvertida. Y por lo tanto, la mayoría de las gramáticas no usan espacios en blanco como sintaxis.
Y si el árbol de sintaxis abstracta no contiene espacios en blanco, porque el analizador los ha descartado, ningún generador puede usarlos para imprimir un AST.
Estaba pensando esto. Algunas gramáticas (como la de C) permiten mucha flexibilidad en cosas como el espacio en blanco. Pero algunas gramáticas no, por lo que cualquier impresora sería automáticamente una bonita impresora. Pero parece que probablemente podrías anotar la gramática con información sobre cuál de las opciones es "bonita", y luego podrías generar una bonita impresora a partir de ahí. –
Eche un vistazo a Invertible syntax descriptions: Unifying parsing and pretty printing.
Nuestra DMS Software Reengineering Toolkit hace exactamente esto (y proporciona una gran cantidad de soporte adicional para analizar/transformar el código).
Ayuda saber que DMS produce un árbol basado directamente en la gramática.
Cada regla de gramática DMS se combina con las llamadas reglas "prettyprinting". Cada regla de impresión simplificada describe cómo "imprimir bastante" el elemento sintáctico reconocido por su regla correspondiente. El proceso de impresión combina esencialmente cajas rectangulares de texto horizontal o verticalmente (con sangría opcional), con hojas produciendo cajas de altura que contienen el valor literal de la hoja (palabra clave, operador, identificador, constante, etc.
Como ejemplo , se podría escribir la siguiente DMS gramática y prettyPrinting regla:
statement = 'for' '(' assignment ';' assignment ';' conditional_expression ')'
'{' sequence_of_statements '}' ;
<<PrettyPrinter>>:
{ V(H('for','(',assignment[1],';','assignment[2],';',conditional_expression,')'),
H('{', I(sequence_of_statements)),
'}');
Esta analizará lo siguiente:
for (i=x*2;
i--; i>-2*x) { a[x]+=3;
b[x]=a[x]-1; }
y prettyprint de la siguiente manera:
for (i=x*2;i--;i>-2*x)
{ a[x]+=3;
b[x]=a[x]-1;
}
DMS también captura los comentarios, los une a los nodos AST y los regenera en la salida. La implementación es exótica porque la mayoría de los analizadores no manejan los comentarios, pero la utilización es fácil, incluso "gratuita"; los comentarios se insertarán automáticamente en el resultado impreso en sus lugares originales.
DMS también puede imprimir en modo "fidelidad". De esta forma, intenta preservar el desplazamiento de columna en la línea de un token analizado. Esto causaría que el texto original se regenerara.
Más detalles sobre lo que debe hacer prettyprinters se proporcionan en mi SO respuesta en Compiling an AST back to source code. DMS trata todos esos temas limpiamente.
Esta capacidad ha sido utilizada por DMS en más de 40 idiomas reales, incluidos IBM COBOL, PL/SQL, Java 1.8, C# 5.0, C (muchos dialectos) y C++ 14.
Hay varios generadores de analizadores sintácticos que incluyen una implementación de un analizador. Uno de ellos es el generador de analizador nearley para gramáticas libres de contexto.
- 1. Agregar un diccionario combinado a un diccionario combinado
- 2. combinado cuadro de autocompletar
- 3. nosetests & Combinado Cobertura
- 4. Aspecto del cuadro combinado
- 5. Combinado SVN sistema FTP?
- 6. generador de copia del generador de C#
- 7. MySQL Unirse con Insertar combinado?
- 8. Eventos del cuadro combinado VB6
- 9. ¿Mejor cuadro combinado de Javascript?
- 10. Apache Shiro combinado con LDAP
- 11. caso cuadro combinado desplegable sensibles
- 12. Lista desplegable de cuadro combinado
- 13. Cepillo combinado de color sólido
- 14. cursor escribir de cuadro combinado
- 15. Agregar enum al cuadro combinado
- 16. Cualquier sugerencia para terceros Generador/generador de formularios web .NET
- 17. Python: Función para aplanar el generador que contiene otro generador
- 18. cuadro combinado de la unión a otro cuadro combinado en WPF
- 19. Obtener el texto seleccionado de un cuadro combinado usando jQuery, por nombre del cuadro combinado?
- 20. Sonido generador de Java
- 21. generador de HTML?
- 22. Moose "generador" vs "predeterminado"
- 23. Generador de texto aleatorio
- 24. Generador de código Python
- 25. Generador Acceleo autónomo
- 26. generador de código C#
- 27. Java genéricos + Generador patrón
- 28. Javascript generador de análisis
- 29. generador de plantillas Javadoc
- 30. Generador de Python Fibonacci
Parece un poco difícil cuando tienes acciones arbitrarias, pero con una gramática de atributo * parece * fácil ... No puedo esperar para sentirme humilde por una respuesta inteligente: D – delnan
@delnan: Y de hecho, con un la gramática del atributo es "bastante fácil". Ver mi respuesta; la especificación prettyprinter es una gramática de atributos con una sintaxis divertida. –