2012-01-26 30 views
12

Estoy buscando obtener un AST para C++ que luego pueda analizar con un programa externo. ¿Qué programas existen para generar un AST para C++? No me importa en qué idioma está implementado o el formato de salida (siempre que sea fácil de analizar).Obtener AST para C++?

Mi objetivo general es transformar un banco de pruebas de la unidad C++ en su correspondiente banco de prueba C# wrapper.

+1

"¿Cerrado como no constructivo?" El OP tiene una solicitud muy clara, y francamente no hay muchas respuestas, por lo que no puede haber mucho debate. Las respuestas proporcionadas hasta ahora están respaldadas por hechos específicos. –

+0

mira esto: http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/ –

+0

y [¿alguna herramienta de refactorización de C/C++ basada en libclang? (incluso el más simple "ejemplo de juguete")] (http://stackoverflow.com/q/7969109/309483) –

Respuesta

12

Puede usar clang y especialmente libclang para analizar el código de C++. Es una biblioteca escrita a mano de muy alta calidad para leer, analizar y compilar código C++, pero también puede generar un AST.

Clang también apoya C, Objective-C y Objective-C++. Clang en sí está escrito en C++.

+0

¿Alguna razón para el bloque de tipo "spoiler"? – Bart

+0

OP no se preocupaba por eso. –

+0

No puedo encontrar la manera de evitar que el AST suene. ¿Hay algún tutorial sobre cómo hacer esto? –

6

En realidad, GCC emitirá la AST en cualquier etapa de la tubería que le interesa, incluyendo las formas genéricas y Gimple. Consulte la (plétora de) interruptores de línea de comando que comienzan con -fdump- - p. -fdump-tree-original-raw

Esta es una de las formas más fáciles (...) de trabajar, ya que puede usarla en código arbitrario; sólo tiene que pasar la adecuada CFLAGS o CXXFLAGS en la mayoría de los Makefiles: “la obra”

make CXXFLAGS=-fdump-tree-original-raw all 

... y se obtiene

Actualizado: Saw este sistema poco gráfica ordenada basado en GCC AST durante la comprobación de mi nombre de la bandera :-) Google FTW.

http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast

2

Nuestra C++ Front End, construido en la cima de nuestra DMS Software Reengineering Toolkit puede analizar una variedad de C++ dialectos (incluyendo C++ 11 y ObjectiveC) y de exportación que AST como un documento XML con un interruptor de línea de comandos. Ver example ASTs produced by this front end.

Como una cuestión práctica, necesitará más que el AST; no se puede hacer mucho con C++ (o cualquier otro lenguaje moderno) sin una comprensión del significado y el alcance de cada identificador. Para C++, el significado/alcance son particularmente desagradables. La interfaz de DMS C++ maneja todo eso; puede construir tablas de símbolos completas asociando identificadores a tipos explícitos de C++. Esa información no se puede descargar en XML con un interruptor de línea de comando, pero es "técnicamente fácil" codificar la lógica en DMS para recorrer la tabla de símbolos y escupir XML. (hay una opción para volcar esta información, solo que no en formato XML).

Te advierto contra la idea de manipular (o incluso analizar) el XML. Primero, XSLT no es una forma particularmente buena de entender el significado de los AST, y mucho menos transformar el AST, porque los AST representan estructuras de lenguaje sensibles al contexto (es por eso que quieres [nee DEBE TENER] la tabla de símbolos). Puede leer el XML en un árbol tipo dom si lo desea y escribir su propio código de procedimiento para manipularlo. Pero source-to-source transformations son una manera más fácil; puede escribir sus transformaciones usando la notación C++ en lugar de cubos de código goo trepando sobre una estructura de datos de árbol.

Tendrá otro problema: cómo generar código C++ válido a partir del XML transformado. Si no le importa escupir el texto en bruto, puede resolver este problema de manera puramente ad hoc, al precio de no tener otra garantía que sudar que el código generado sea sintácticamente válido.Si desea generar una representación en C++ de su resultado final como AST y regenerar un texto válido a partir de eso, necesitará un prettyprinter, que no son técnicamente difíciles, pero que aún requieren mucho trabajo de compilación, especialmente para un lenguaje tan grande como C++.

Finalmente, la razón por la que existen herramientas como DMS es proporcionar la gran cantidad de infraestructura que se necesita para procesar/manipular una estructura compleja como C++ AST. (analizar, analizar, transformar, impresión bonita). Puede intentar replicar toda esta maquinaria usted mismo, pero esto generalmente es una compensación de tiempo/costo/productividad pobre. La afirmación es que lo mejor es permanecer dentro del ecosistema de herramientas en lugar de escapar de él y crear versiones malas de él mismo. Si no has hecho esto antes, lo sabrás con dolor.

FWIW, DMS se ha utilizado para realizar análisis masivos y transformaciones en el código fuente de C++. Consulte Publications on DMS y revise los documentos de Akers en "Reingeniería de modelos de componentes C++".

Clang se basa en el mismo tipo de filosofía; hay un ecosistema de herramientas.

YMMV, pero me sorprendería.