使用clang Python绑定解析clang生成的AST

时间:2015-12-08 18:06:01

标签: python clang llvm-clang

我有一个头文件,我想为其生成一个AST并将其保存到文件中。我在Visual Studio命令行上运行clang-cl,如下所示:

clang-cl <header-path> -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics -w

然后我接受此命令的输出并将其保存到名为f.ast的文件中。我现在想用clang Python绑定从该文件中读取AST。我创建了以下脚本:

from clang.cindex import Config, Index
import clang.cindex
import os
import logging

def read_ast(libclang_path, ast_file):
    assert os.path.exists(libclang_path)
    assert os.path.exists(ast_file)
    Config.set_library_file(libclang_path)
    logging.debug("Creating index...")
    index = Index(clang.cindex.conf.lib.clang_createIndex(False, True))
    logging.debug("Reading ast file '{}'...".format(
        ast_file
    ))
    tu = index.read(ast_file)
    assert tu is not None

并用适当的args调用它。将“读取文件'f.ast'...”打印到终端后,出现以下弹出错误标题为“Microsoft Visual C ++运行时库”:

  

断言失败了!

     

程序:C:\ Program Files(x86)\ LLVM \ bin \ libclang.dll文件D:\ src \ llvm_release_build_3.7.0 \ llvm ... / Bitstre ... eader.h行:78

     

表达式:((结束 - 开始)&amp; 3)== 0&amp;&amp; “Bitcode流不是4字节的倍数”

你知道问题可能是什么以及如何解决它?

1 个答案:

答案 0 :(得分:1)

AST转储是一个调试工具。它与翻译单元的序列化表示不同。使用libclang解析和序列化标题,而不是使用clang-cl从命令行执行此操作。