Если у меня есть следующий макрос в каком-то коде 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?