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?