2012-09-20 7 views
15

¿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

+0

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

+0

@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. –

Respuesta

0

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.

+0

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í. –

1

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.

1

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.