2016-12-01 180 views
2

ITranslationUnit和IASTTranslationUnit接口分別代表單個C/C++源文件的翻譯單元和AST。Eclipse CDT:獲取C++項目的AST

有什麼辦法可以獲得整個C++項目的AST,還是需要從主文件的AST開始,並通過include指令導航併爲每個源單元生成單獨的AST?

謝謝。

回答

3

CDT的AST不是爲了擴展到整個項目而設計的。一旦你開始進入10000+ LOC範圍,它很可能開始表現非常糟糕。

對於跨文件分析的目的,CDT有一個索引器,它解析項目中的每個文件(一次一個),並構建一個關於項目中整個代碼的信息數據庫(稱爲索引)。該索引通過接口IIndex進行訪問,該實例可以通過在任何AST上調用IASTTranslationUnit.getIndex()來獲得(例如)。

大多數代碼分析和操作使用情況分爲以下工作流程之一:

  • 只需使用索引。 IIndex給你很多的工作,比如:

    • findBindings()各種重載找到綁定匹配的姓名或名稱前綴
    • findReferences(binding)給你一個結合
    • findDeclarations(binding)所有引用給你綁定的所有聲明


    和許多其他。編輯器導航功能(如Open Declaration和Call Hierarchy)的工作方式就是這樣。

  • 使用該索引標識需要AST的一小組源文件,然後解析這些文件。這就是重構的工作原理。例如,重命名重構使用索引來查找被重命名的綁定的使用,然後爲包含這些用於執行重構的文件創建AST。

  • 如果以上都不夠好,並且您確實需要項目中每個文件的AST級別信息,請爲項目中的每個文件創建一個AST,然後從中提取您需要的信息每一個。這是索引器本身的工作原理。 (請注意,如果您選擇此選項,則無需導航即可列出需要解析的所有文件,而只需枚舉項目中的所有文件。有關示例,請參見PDOMRebuildTask.createDelegate()。)

如果您更多地瞭解您的用例,我可能會提供更具體的建議。

+0

我想你是說CDT自然分析單個源文件,但不是它的包含文件。那麼,如果必要的聲明信息在包含文件中,CDT如何解析「最令人頭痛的解析」(或任何其他語法上模棱兩可的構造)?請參閱http:// stackoverflow。com/questions/17388771/get-human-readable-ast-from-c-code/17393852#17393852 –

+0

@IraBaxter:索引器以依賴性順序解析文件,並從索引中先前解析的文件中查找信息。 – HighCommander4

+0

根據關於預處理器條件變量狀態的恆定性的一些假設? (可以想象一個CU正在執行#define FLAG TRUE,另一個CU正在執行#define FLAG FALSE,然後它們都包括一個檢查該標誌的頭文件) –