2014-09-22 88 views
4

在網絡上發現的用於clang工具的例子總是在玩具例子上運行,這些例子通常都是非常簡單的C程序。clang libTooling:如何找到一個AST項目出來的頭?

我正在構建一個在C++代碼上執行源代碼到源代碼轉換的工具,這顯然是一項非常非常具有挑戰性的任務,但是鏗鏘有力於完成這項任務。

我現在面臨的問題是,clang爲任何利用STL的C++代碼生成的AST是巨大的。例如,我有一些C++代碼,其中clang++ -ast-dump ... | wc -l是67,018行恐怖的AST gobbledygook!

99%這是標準庫的東西,我打算在源到源元編程任務中忽略它。所以,爲了實現這一點,我想簡單地過濾掉文件。假設我只想看看我正在分析的項目頭文件中的類定義(並忽略所有標準庫頭文件),我只需要弄清楚我的每個CXXRecordDecl是從哪裏來的!

可以這樣做嗎?

編輯:希望this是一種方式去解決它。現在就試試這個......重要的一點是,它必須告訴我頭文件decls已經出來,而不是與翻譯單元對應的cpp文件。我期待在

+0

我在冒險中得到了一點進步 - 基本上這裏的標準方法是使用替換。 – 2015-01-23 03:31:06

回答

0

一個路徑是有事情要縮小的比賽就像hasName()(如發現here例如:

recordDecl(hasName("MyBaseClass")) // etc. 

但是上面使用-ast-dump您的評論是我試過,以及讓外行我發現this post非常有幫助,用他們的建議武裝起來,我用clang-check來過濾到一個特定的類名,並將它提供給我的頂級CPP文件,輸出更容易管理代表類別聲明和定義的百行代碼

+0

匹配器中的Yep'hasName'是一個很好的事情,當你正在尋找特定的東西。與'ast-dump-filter'類似,儘管我會想象一旦你開始用很多類來檢查更大的代碼庫,它可能會很快變得非常笨拙。希望如果它發生所有封裝到一個單一的名稱空間,並且'ast-dump-filter'在名稱空間上工作,那麼你仍然會運氣好。 – 2015-05-29 15:54:28

1

以我迄今爲止的經驗,某些給定AST節點的「源」最好通過使用位置來檢索。例如,每個節點至少有一個起始位置,當你打印出來時它將包含頭文件路徑。

然後,可以使用此路徑來決定它是系統庫還是您仍然有興趣檢查的應用程序代碼的一部分。

相關問題