我正在研究利用Clang的AST來編寫我的C代碼,並對AST做一些分析。一些關於從哪裏開始,如何獲得Clang的AST,教程或任何這方面的指示將有很大的幫助!如何使用Clang的AST?
我一直在試圖找到一些,我得到了這兩年前創建的這個link。但由於某種原因,它不適合我。示例代碼在教程中給了我太多的錯誤。所以我不確定,如果我正確地構建代碼或者本教程有一些錯誤。但我很樂意從其他頁面開始。
我正在研究利用Clang的AST來編寫我的C代碼,並對AST做一些分析。一些關於從哪裏開始,如何獲得Clang的AST,教程或任何這方面的指示將有很大的幫助!如何使用Clang的AST?
我一直在試圖找到一些,我得到了這兩年前創建的這個link。但由於某種原因,它不適合我。示例代碼在教程中給了我太多的錯誤。所以我不確定,如果我正確地構建代碼或者本教程有一些錯誤。但我很樂意從其他頁面開始。
開始與沙爾斯鏈接的教程。然後通過Clang的Doxygen。從SemaConsumer開始。
閱讀了很多源代碼。鏗鏘是一個移動的目標。如果你正在編寫基於鏗鏘的工具,那麼你需要認識到,鏗鏘是每天添加和修復功能,所以你應該準備閱讀很多代碼!
我覺得這個ASTUnit :: LoadFromCompilerInvocation()fn是構建AST的最簡單的方法。
此鏈接可能會給你一些想法http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471
你可能想在libclang庫提供的穩定的C API,而不是不穩定的C++,其他人已經提到的內部API。
當前最好的文檔是談話視頻/幻燈片,「libclang:思考超越編譯器」,可在LLVM Developers Meeting website上找到。
但是請注意,API的穩定性是以全面性爲代價的。您將無法使用此API執行所有內容,但使用起來要容易得多。
爲了獲得AST以及瞭解前端的各個階段,在「LLVM核心庫」一書中有一個前端章節。基本上,它具有這樣的流量(在LLVM-4.0.1的情況和應更高版本類似):
cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
CompilerInstance.cpp:CompilerInstance::ExecuteAction
ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
CodeGenAction.cpp:HandleTranslationUnit
的最後一個函數處理整個翻譯單元(此時已經處理了最高級別的翻譯),並且調用EmitBackendOutput
來做後端材料。所以這個函數是一個很好的地方,你可以用完整的AST做一些事情,然後發佈後端輸出。
在如何操縱AST方面,鏗鏘有一些基本的教程:http://clang.llvm.org/docs/RAVFrontendAction.html。
也看看ASTDumper.cpp
。這是訪問AST的最好例子。
另一個很好的教程:https://jonasdevlieghere.com/understanding-the-clang-ast/教你如何通過三種不同的方法在AST中找到一個特定的呼叫expr。
我經歷了代碼。我發現很難理解,因爲沒有引用結構或類名,意味着什麼以及爲什麼使用它。雖然這個鏈接看起來像一個好的開端,但是對於每個東西的意義的一些參考將有助於理解基礎知識。 – bsoundra 2011-02-27 01:31:04