Wie kann ich Makros in C ++ - Code mit CLANG als Parser und Python als Skriptsprache analysieren?

Wenn ich das folgende Makro in irgendeinem C ++ - Code habe:

<code>_Foo(arg1, arg2)
</code>

Ich möchte Python verwenden, um alle Instanzen und Bereiche dieses Makros mithilfe von Clang und den mit cindex.py bereitgestellten Python-Bindungen zu finden. Ich möchte keinen regulären Ausdruck von Python direkt für den Code verwenden, da ich damit zu 99%, aber nicht zu 100% dorthin komme. Es scheint mir, dass Sie, um auf 100% zu kommen, einen echten C ++ - Parser wie Clang verwenden müssen, um alle Fälle zu behandeln, in denen Leute alberne Dinge tun, die syntaktisch korrekt und kompiliert sind, für einen regulären Ausdruck aber keinen Sinn ergeben. Ich muss 100% der Fälle behandeln, und da wir Clang als einen unserer Compiler verwenden, ist es sinnvoll, es auch für diese Aufgabe als Parser zu verwenden.

Mit dem folgenden Python-Code kann ich scheinbar vordefinierte Typen finden, die die Clang-Python-Bindungen kennen, aber keine Makros:

<code>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)
</code>

Was ich denke, dass ich suche, ist eine Weise, das rohe AST für den Namen meines Makros zu analysieren_FOO(), aber ich bin mir nicht sicher. Kann jemand einen Code bereitstellen, mit dem ich den Namen eines Makros übergeben und den Umfang oder die Daten von Clang zurückerhalten kann?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage