Si tengo la siguiente macro en algún código C++:¿Cómo puedo analizar macros en código C++, usando CLANG como analizador y Python como lenguaje de scripting?
_Foo(arg1, arg2)
me gustaría usar Python para mí encontrar todas las instancias y grados de esa macro utilizando Clang y los enlaces Python provistos de cindex.py. No quiero usar directamente una expresión regular de Python en el código porque eso me lleva al 99% del camino, pero no al 100%. Me parece que para llegar al 100%, necesita utilizar un analizador de C++ real como Clang para manejar todos los casos en que las personas hacen cosas tontas que son sintácticamente correctas y compilan, pero que no tienen sentido para una expresión regular. Necesito manejar el 100% de los casos y dado que usamos Clang como uno de nuestros compiladores, tiene sentido usarlo como el analizador para esta tarea también.
Dado el siguiente código Python soy capaz de encontrar lo que parecen ser los tipos predefinidos que los enlaces Clang pitón conocen, pero no las macros:
def find_typerefs(node):
ref_node = clang.cindex.Cursor_ref(node)
if ref_node:
print 'Found %s Type %s DATA %s Extent %s [line=%s, col=%s]' % (
ref_node.spelling, ref_node.kind, node.data, node.extent, node.location.line, node.location.column)
# Recurse for children of this node
for c in node.get_children():
find_typerefs(c)
index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
find_typerefs(tu.cursor)
lo que pienso que estoy buscando es una manera de Analizar AST en bruto para el nombre de mi macro _FOO()
, pero no estoy seguro. ¿Puede alguien proporcionar algún código que me permita pasar el nombre de una macro y recuperar el alcance o los datos de Clang?
's/CLANG/Clang/g' –
No he usado Clang, pero no creo que encuentres tu macro en el AST. Si nos fijamos en las etapas de la compilación de C++ (http://stackoverflow.com/questions/8833524/what-are-the-stages-of-compilation-of-ac-program) las macros "desaparecen" en la parte de preprocesamiento que es completado antes de la compilación y se genera el AST. En este punto, su macro no existe ya que ha sido completamente reemplazada por el contenido de la macro. Me gustaría ver la parte de preprocesamiento de Clang y ver qué puede obtener de eso. – uesp
@uesp Bueno, Clang no es solo un compilador. Es un * gran * compilador que se esfuerza por proporcionar * grandiosos * diagnósticos. Es por eso que las macros * son * rastreadas en Clang (consulte la [lista de clases] (http://clang.llvm.org/doxygen/annotated.html) para detectar las ocurrencias de "macro"), hasta cierto punto. Me sorprendería mucho si eso atrapase incluso las macros más desafiantes de la sintaxis, pero creo que es muy posible que funcionen macros como OP. – delnan