2012-06-08 78 views
3

我一直試圖從Clang獲得ASTs,但迄今爲止我還沒有成功。我發現了一歲question在這裏堆棧提到約兩其他方式獲得使用鏘這是AST:如何使用Clang獲取當前版本的AST?

./llvmc -cc1 -ast突降file.c

./llvmc -cc1 -ast打印file.c

在此question的doxygen被提及和representation其中的AST給出,但我主要是想找一個一些文字形式,如XML,這樣可以進行進一步的分析。

最後還有另一個question在這裏堆棧關於確切的XML導入,但由於幾個原因也提到了它已經停產。

因此,我的問題是,哪個版本以及如何從控制檯使用它來獲取C中給定代碼的ast相關信息?我相信這是一個非常無痛的單行命令代碼,就像上面的那些命令代碼一樣,但是文檔索引沒有提及任何關於ast的東西,就像我讀過的那樣,而且我發現的唯一一個是關於用手寫AST的是不是真的我在找什麼。

我嘗試了上述所有命令,但它們都已在2.9版本上失敗,並且我已經發現llvm在每個版本之間會發生很大變化。

謝謝。

+0

Doxygen AFAIK不會產生任何類似AST的東西。 –

+0

您提到的其他答案是說,從Clang中刪除了XML導出格式。恕我直言,這是一件好事,因爲任何規模的C程序的真正的XML樹都將是非常可怕的,而且XML操作起來很尷尬;您想使用工具中內置的工具來訪問AST。 –

+0

... Clang是你會考慮的唯一工具嗎? –

回答

3

OP表示「也接受其他建議」。

他可能會認爲我們的DMS Software Reengineering Toolkit與其C Front End。儘管展示由此產生的C AST非常容易,但使用相同的C前端(ObjectiveC是C的一種方言)顯示由DMS生成的ObjectiveC AST [已經在SO]是更容易的。 請參閱https://stackoverflow.com/a/10749970/120163 DMS也可以生成與此類似的XML。

我們不建議將樹導出爲文本,因爲實際代碼中的實際樹簡直是巨大的,並且與我們的經驗中的文本或XML對象相比操作較差。一個通常需要超越解析的機器。請參閱我的討論關於Life After Parsing

+1

GCC,Clang,FramaC,CIL是我所知道的FOSS解決方案。這些地址中的每一個在某種程度上都是「解析後的生活」問題。我建立DMS是因爲我相信這些解決方案是不夠的;注意所有這些工具都是特定於C或C++的,它沒有解決處理大型複雜軟件系統的問題。這些是否足以解決您的問題需要您做出判斷。 –