2011-03-15 9 views
21

Logré compilar exitosamente clang para windows con cmake y visual studio 10. Me gustaría obtener un archivo XML como representación AST del código fuente. Hay una opción que proporciona el resultado con sonido metálico con gcc bajo Linux (Ubuntu), pero no funciona en la caja de ventanas:¿Puedo obtener un volcado XML AST del código C/C++ con clang sin usar el compilador?

clang -cc1 -ast-print-xml source.c 

Sin embargo, esto está invocando la etapa de compilación (que me gustaría evitar) . Cavar en el código fuente no me ayudó, en la medida en que soy bastante nuevo en el clang. Lo que pude para generar la versión binaria de la AST usando:

clang -emit-ast source.c 

Por desgracia, este formato no se puede utilizar directamente para el análisis. ¿Hay algún método existente para generar directamente el árbol XML en lugar de uno binario en clang?

El objetivo es usar la representación XML en otras herramientas en el entorno .NET, así que tendría que hacer un ajuste de la lib de clang nativo para acceder al AST binario. Tal vez haya una tercera opción si alguien ya escribió algún analizador AST de clang binario para .NET?

Es posible que me falte algo como si el AST generado por el frente de clang no es equivalente al generado en la etapa de compilación.

+2

Mi empresa crea interfaces C++, y * podemos * emitir volcados XML completos de los AST. Tenemos esto como un elemento de casilla de verificación, porque las personas lo solicitan. Nadie realmente lo usa, porque la cantidad de salida para un programa C++ real (que incluye todos los archivos de encabezado) es simplemente * enorme *, lo que hace que sea lento y torpe de manejar. La verdadera pregunta es, ¿por qué quieres hacer esto?Clang probablemente ya ofrezca una gran cantidad de maquinaria para procesar el C++ AST directamente (al igual que nuestra herramienta correspondiente); ¿Por qué querrías tratar de replicar todo ese trabajo? ¿Por qué no simplemente usar Clang para su propósito? –

+0

... vea un volcado de árbol C++ en http://stackoverflow.com/a/17393852/120163 Esto no es XML, pero la herramienta también puede producir XML con exactamente el mismo contenido. –

Respuesta

20

Para su información, la impresora XML ha sido eliminada de la versión 2.9 por Douglas Gregor (responsable de CLang FrontEnd).

El problema era que faltaba la impresora XML. Varios de los nodos AST nunca se habían implementado en la impresora, así como algunas de las propiedades de algunos nodos, lo que condujo a una representación incorrecta del código fuente.

Otro punto planteado por Douglas fue que la salida debería ser adecuada no para depurar CLang en sí (que es lo que trata el -emit-ast) sino para el consumo de herramientas externas. Esto requiere que la salida sea estable de una versión a otra. Notablemente, no debe ser una asignación 1-a-1 de CLang interna, sino traducir el código fuente a standardese.

A menos que haya una importante labor en la impresora (que requiere voluntarios) que no se integrará volver ...

+3

Lo gracioso es que '-emit-ast' imprime bastante tipos en lugar de representar su estructura, y por esta razón es absolutamente inútil. Solo fue posible con una impresora xml depurar y verificar automáticamente los tipos en las declaraciones. –

+0

@ SK-logic: dado que xml ya no es una opción, podríamos ver una mejora en el comportamiento '-emit-ast'. –

+0

Gracias por toda esta información interesante. Echaré un vistazo a la vieja impresora xml e intentaré ver si puedo hacer algo útil con ella para mi propio uso. Tener una forma universal/estandarizada de representar el código fuente sería realmente algo bueno, pero un denominador común implica tirar las características y mantener cosas específicas para todo tipo de idiomas lo hace demasiado complejo ... Algún enfoque extensible sería agradable ... Por ahora, muchas gracias por esta respuesta. – jdehaan

3

He estado trabajando en mi propia versión de la extracción de XML a partir de AST de Sonido metálico. Mi código usa los enlaces de Python de libclang para atravesar el AST.

Mi código se encuentra en https://github.com/BentleyJOakes/PCX

Edit: Debo añadir que es bastante incompleta en términos de producir las señales de código fuente adecuados para cada nodo AST. Desafortunadamente, esto debe codificarse para cada tipo de nodo AST. Sin embargo, el código debería proporcionar una base para cualquier persona que desee continuar con esto.

1

El uso de un ASTDumper personalizado haría el trabajo, sin la compilación de ningún archivo fuente. (deje de tocar el claqué en la parte frontal). pero tienes que tratar con todas las fuentes de código C y C++ de llvm para lograr eso.

Cuestiones relacionadas