2011-02-27 21 views
22

Estoy buscando hacer uso de Clang's AST para mi código C y hacer algunos análisis sobre el AST. ¡Algunos consejos sobre dónde empezar, cómo obtener AST de Clang, tutoriales o cualquier cosa en este sentido serán de gran ayuda!¿Cómo hacer uso de Clang's AST?

He estado tratando de encontrar algunos y obtuve este link que fue creado hace 2 años. Pero por alguna razón, no funciona para mí. El código de muestra, en el tutorial, me da demasiados errores. Así que no estoy seguro si construyo el código correctamente o si algo está mal con el tutorial. Pero me gustaría comenzar desde otra página también.

Respuesta

14

de inicio con el tutorial unidos por sharth. Luego revisa Clang's Doxygen. Comience con SemaConsumer.

Lea un montón de código fuente. Clang es un objetivo en movimiento. Si estás escribiendo herramientas basadas en clang, entonces debes reconocer que el clang está agregando y reparando funciones a diario, ¡así que debes estar preparado para leer un montón de código!

9

Es posible que desee la API C estable proporcionada en la biblioteca libclang, en comparación con el C++ API inestable internos que otros han mencionado.

La mejor documentación para comenzar actualmente es el video/diapositivas de la charla, "libclang: Pensando más allá del compilador" disponible en el LLVM Developers Meeting website.

Sin embargo, tenga en cuenta que la estabilidad de la API tiene un costo de exhaustividad. No podrá hacer todo con esta API, pero es mucho más fácil de usar.

0

Para obtener el AST, así como conocer las etapas de la interfaz, hay un capítulo frontend en el libro "bibliotecas básicas de LLVM". Básicamente se tiene un flujo de este tipo (en el caso de llvm-4.0.1 y debe similar para las versiones posteriores):

  • cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
  • CompilerInstance.cpp:CompilerInstance::ExecuteAction
  • ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
  • CodeGenAction.cpp:HandleTranslationUnit

El la última función maneja la unidad de traducción completa (las declas de nivel superior ya se manejan en este punto), y llama al EmitBackendOutput para hacer cosas de fondo. Así que esta función es un buen lugar donde puedes hacer algo con el AST completo y antes de emitir la salida del backend.

En términos de cómo manipular el AST, clang tiene un tutorial básico sobre esto: http://clang.llvm.org/docs/RAVFrontendAction.html.

También vea ASTDumper.cpp. Es el mejor ejemplo de visitar el AST.

Otro buen tutorial: https://jonasdevlieghere.com/understanding-the-clang-ast/ le enseña cómo encontrar un expr expr en el AST a través de tres enfoques diferentes.