ejecutar con compilar compilador xml clang code-generation abstract-syntax-tree

compilar - ¿Puedo obtener un volcado XML AST de código C/C++ con clang sin usar el compilador?



gcc compilador (3)

El uso de un ASTDumper personalizado haría el trabajo, sin que Ofc compile ningún archivo fuente. (Detener el clang en la parte frontal). pero tienes que lidiar con todas las fuentes de código C y C ++ de llvm para lograrlo.

Logré compilar correctamente el 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 clang con gcc en linux (ubuntu) pero no funciona en el cuadro de ventanas:

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

Sin embargo, esto está invocando la etapa de compilación (que me gustaría evitar). Excavar en el código fuente no me ayudó en la medida en que soy bastante nuevo para sonar. Podría administrar la versión binaria del AST usando:

clang -emit-ast source.c

Desafortunadamente, este formato es inutilizable 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 utilizar la representación XML en otras herramientas en el entorno .NET, por lo que necesitaría hacer un ajuste alrededor de la lib Clang nativa para acceder al AST binario. Tal vez haya una tercera opción si alguien ya escribió algún analizador AST de blang cinario para .NET?

¿Es posible que me falte algo como si el AST generado por el extremo frontal del clang no es equivalente al generado en la etapa de compilación?


He estado trabajando en mi propia versión de extracción de XML de AST de Clang. Mi código utiliza los enlaces Python de libclang para atravesar el AST.

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

Edición: debo agregar que está bastante incompleta en términos de producir los tokens de código fuente correctos para cada nodo AST. Desafortunadamente, esto debe codificarse para cada tipo de nodo AST. Sin embargo, el código debe dar una base para cualquier persona que quiera continuar con esto.


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. Algunos de los nodos de AST nunca se habían implementado en la impresora, así como algunas de las propiedades de algunos nodos, lo que llevó a una representación inexacta del código fuente.

Otro punto planteado por Douglas fue que la salida debería ser adecuada no para la depuración de CLang (que es de 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. En particular, no debería ser un mapeo 1-a-1 de CLang interno, sino más bien traducir el código fuente a un idioma estándar .

A menos que haya un trabajo significativo en la impresora (que requiere voluntarios), no se integrará nuevamente ...