Jak mogę analizować makra w kodzie C ++, używając CLANG jako parsera i Pythona jako języka skryptowego?

Jeśli mam następujące makro w niektórych kodach C ++:

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

Chciałbym użyć Pythona, aby znaleźć wszystkie instancje i zakresy tego makra za pomocą Clang i powiązań Pythona dostarczonych z cindex.py. Nie chcę używać wyrażenia regularnego z Pythona bezpośrednio na kodzie, ponieważ daje mi to 99% drogi, ale nie 100%. Wydaje mi się, że aby uzyskać 100%, musisz użyć prawdziwego parsera C ++, takiego jak Clang, aby obsłużyć wszystkie przypadki, w których ludzie robią głupie rzeczy, które są poprawne składniowo i kompilują, ale nie mają sensu w wyrażeniu regularnym. Muszę obsłużyć 100% przypadków, a ponieważ używamy Clang jako jednego z naszych kompilatorów, warto użyć go jako parsera do tego zadania.

Biorąc pod uwagę następujący kod Pythona, jestem w stanie znaleźć to, co wydaje się być predefiniowanymi typami, o których wiedzą powiązania pythonowe Clang, ale nie makrami:

<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>

Myślę, że szukam sposobu na przeanalizowanie surowego AST dla nazwy mojego makra_FOO(), ale nie jestem pewien. Czy ktoś może podać kod, który pozwoli mi podać nazwę makra i odzyskać zakres lub dane z Clang?

questionAnswers(2)

yourAnswerToTheQuestion