我正在使用clang bingings python将c / c ++代码遍历到AST中,如何获得基于树的AST结构? 一些有关从何处开始的指南,教程或与此相关的任何内容将大有帮助!!!
我发现了一件非常有用的作品(如果您想检查一下,这里是链接:https://www.chess.com/blog/lockijazz/using-python-to-traverse-and-modify-clang-s-ast-tree)并尝试了他的代码,很遗憾,我没有得到有用的输出。
function_calls = []
function_declarations = []
def traverse(node):
for child in node.get_children():
traverse(child)
if node.type == clang.cindex.CursorKind.CALL_EXPR:
function_calls.append(node)
if node.type == clang.cindex.CursorKind.FUNCTION_DECL:
function_declarations.append(node)
print 'Found %s [line=%s, col=%s]' % (node.displayname, node.location.line, node.location.column)
clang.cindex.Config.set_library_path("/Users/tomgong/Desktop/build/lib")
index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
root = tu.cursor
traverse(root)
答案 0 :(得分:0)
如何获取基于树的AST结构?
翻译单元对象的光标(tu.cursor
)实际上是AST的起始节点。您可能想使用clang
工具以可视方式分析树。也许这将为您带来启发,并为您提供如何使用树的直觉。
clang++ -cc1 -ast-dump test.cpp
但是从根本上讲,它归结为获得主节点(tu.cursor
)的子节点并递归遍历它们,然后到达您感兴趣的节点。
您可能还想查看Eli Benderski的文章,如何开始使用python绑定: https://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang#id9
不幸的是,我没有得到有用的输出。
当您不提供解析文件中包含到libclang模块的路径时,您可能会遇到不完整或错误的解析。例如,如果要解析的源文件使用了一些QT包含,则您需要在parse()
调用中指定相关的包含路径,例如此处的示例:
index = clang.cindex.Index.create()
tu = index.parse(src_file, args = [
'-I/usr/include/x86_64-linux-gnu/qt5/',
'-I/usr/include/x86_64-linux-gnu/qt5/QtCore'])
还可以在libclang.cindex python模块中查找一些注释,它们可以为您提供帮助。例如,我通过阅读这些评论找到了上面的解决方案。
答案 1 :(得分:0)