Как я могу анализировать макросы в коде C++, используя CLANG в качестве синтаксического анализатора и Python в качестве языка сценариев?

Если у меня есть следующий макрос в каком-то коде C++:

_Foo(arg1, arg2)

Я хотел бы использовать Python, чтобы найти все экземпляры и экстенты этого макроса, используя Clang и привязки Python, предоставленные с cindex.py. Я не хочу использовать регулярное выражение из Python напрямую в коде, потому что это дает мне 99% пути, но не 100%. Мне кажется, что для достижения 100% вам нужно использовать настоящий синтаксический анализатор C++, такой как Clang, чтобы обрабатывать все случаи, когда люди делают глупые вещи, которые синтаксически правильны и компилируются, но не имеют смысла для регулярного выражения. Мне нужно обработать 100% случаев, и поскольку мы используем Clang в качестве одного из наших компиляторов, имеет смысл использовать его и в качестве парсера для этой задачи.

Учитывая следующий код Python, я могу найти то, что кажется предопределенными типами, о которых знают привязки Python Clang, но не макросы:

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)

Я думаю, что ищу способ проанализировать необработанный AST для имени моего макроса _FOO(), но я не уверен.Может ли кто-нибудь предоставить какой-нибудь код, который позволит мне передать имя макроса и получить экстент или данные из Clang?

12
задан askewchan 25 February 2013 в 15:48
поделиться