2015-12-08 241 views
0

我有一個頭文件,我想要生成AST並將其保存到文件中。我在Visual Studio的命令行運行clang-cl這樣的:解析clang與clang Python綁定生成的AST

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 

並用適當的參數調用它。打印「讀AST文件‘F.AST’......」到終端後,我得到了以下彈出錯誤標題爲「微軟的Visual C++運行時庫」:

斷言失敗!

程序:C:\ Program Files文件(x86)的\ LLVM \ BIN \ libclang.dll文件d:\ SRC \ llvm_release_build_3.7.0 \ LLVM .../Bitstre ... eader.h行:78

表達式:((完啓動)& 3)== 0 & &「位碼流不是4個字節的倍數」

你知道是什麼問題是,如何解決?

回答

1

AST dump是一個調試工具。這與翻譯單元的序列化表示不同。使用libclang解析並序列化您的頭文件,而不是使用clang-cl從命令行執行。

+0

函數'read'在clang的Python綁定中做了什麼:https://github.com/llvm-mirror/clang/blob/master/bindings/python/clang/cindex.py#L2220)?是不是要讀取由clang命令行中的-emit-ast或-ast-dump生成的AST? – BlackSheep

+2

'read'接受一個用'TranslationUnit.save'編寫的AST文件。 -ast-dump不寫入AST文件。它以可讀的格式打印AST。 –