使用Python遍历Clang AST

时间:2019-03-30 07:00:02

标签: python-3.x clang abstract-syntax-tree

我正在使用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)

2 个答案:

答案 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)

我一直在使用 pycparser 来获取 C/C++ 源代码的 AST 并使用 python 进行探索。

您可以在此 example 中的存储库中找到用于探索 AST 的 API。