gpt4 book ai didi

c++ - 如何使用 CLANG 作为解析器并使用 Python 作为脚本语言来解析 C++ 代码中的宏?

转载 作者:IT老高 更新时间:2023-10-28 23:19:32 25 4
gpt4 key购买 nike

如果我在某些 C++ 代码中有以下宏:

_Foo(arg1, arg2)

我想使用 Python 使用 Clang 和 cindex.py 提供的 Python 绑定(bind)来查找该宏的所有实例和范围。我不想直接在代码上使用 Python 中的正则表达式,因为这让我达到了 99%,但不是 100%。在我看来,要达到 100%,您需要使用真正的 C++ 解析器(如 Clang)来处理人们执行语法正确和编译但对正则表达式没有意义的愚蠢事情的所有情况。我需要处理 100% 的情况,并且由于我们使用 Clang 作为我们的编译器之一,因此也可以将其用作此任务的解析器。

鉴于以下 Python 代码,我能够找到 Clang python 绑定(bind)知道但不知道宏的预定义类型:

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 中取回范围或数据吗?

最佳答案

您需要将适当的 options 标志传递给 Index.parse:

tu = index.parse(sys.argv[1], options=clang.cindex.TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD)

光标访问者的其余部分可能如下所示:

def visit(node):
if node.kind in (clang.cindex.CursorKind.MACRO_INSTANTIATION, clang.cindex.CursorKind.MACRO_DEFINITION):
print 'Found %s Type %s DATA %s Extent %s [line=%s, col=%s]' % (node.displayname, node.kind, node.data, node.extent, node.location.line, node.location.column)
for c in node.get_children():
visit(c)

关于c++ - 如何使用 CLANG 作为解析器并使用 Python 作为脚本语言来解析 C++ 代码中的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10113586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com