2012-01-26 59 views
12

我在找一個AST for C++,然後我可以用外部程序來解析。哪些程序適用於生成AST for C++?我不在乎它實現了什麼語言或輸出格式(只要它是可以解析的)。獲取AST for C++?

我的總體目標是將C++單元測試平臺轉換爲相應的C#包裝測試牀。

+1

「封閉不具有建設性?」 OP有一個非常明確的要求,坦率地說沒有很多答案,所以不會有太多爭論。提供給我們的答案由具體事實支持。 –

+0

檢查了這一點:http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/ –

+0

和[基於libclang的任何C/C++重構工具? (甚至最簡單的「玩具示例」)](http://stackoverflow.com/q/7969109/309483) –

回答

12

您可以使用clang,尤其是libclang來解析C++代碼。這是一個非常高質量的手寫庫,用於瀏覽,分析和編譯C++代碼,但它也可以生成AST。

鏗鏘支持C,Objective-C和Objective-C++。 Clang本身是用C++編寫的。

+0

「擾流器」類型blockquote的任何原因? – Bart

+0

OP不關心這一點。 – 2012-01-26 21:39:31

+0

我無法弄清楚如何從叮噹中獲得AST。有沒有關於如何做到這一點的教程? –

6

事實上,GCC會在你感興趣的管道任何階段發出AST,包括GENERIC和GIMPLE形式。查看從-fdump-開始的(過多的)命令行開關 - 例如-fdump-tree-original-raw

這是一種更簡單(...)的工作方式,因爲您可以在任意代碼上使用它;只是通過適當的CFLAGSCXXFLAGS到大多數的Makefile:「作品」

make CXXFLAGS=-fdump-tree-original-raw all 

...,你會得到

更新時間:鋸基於GCC AST的這個整潔的小圖形系統,同時檢查我的標誌名稱:-) Google FTW。

http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast

2

我們C++ Front End,建立在我們DMS Software Reengineering Toolkit的頂部可以解析多種C++的方言(包括C++ 11和的ObjectiveC)和出口的是AST作爲與命令行開關的XML文檔。請參閱example ASTs produced by this front end.

實際情況下,您需要的不僅僅是AST;如果不瞭解每個標識符的含義和範圍,就無法真正用C++(或任何其他現代語言)做很多事情。對於C++來說,意義/範圍尤其難看。 DMS C++前端處理所有這些;它可以構建將標識符與顯式C++類型相關聯的完整符號表。這些信息在命令行開關中不是可以用XML輸出的,但是在DMS中編寫邏輯以遍歷符號表和吐出XML在技術上是「容易的」。 (有一個選項可以轉儲此信息,而不是XML格式)。

我提醒您不要操縱(甚至只是分析)XML。首先,XSLT不是一種理解AST的含義的非常好的方法,更不用說轉換AST了,因爲AST表示上下文敏感的語言結構(這就是爲什麼你需要[nee必須]符號表)。如果你願意,你可以將XML讀取成類似dom的樹,並編寫自己的過程代碼來操作它。但source-to-source transformations是一種更簡單的方法;您可以使用C++符號來編寫轉換,而不是使用代碼組goo爬過樹數據結構。

您將遇到另一個問題:如何從轉換的XML生成有效的C++代碼。如果你不介意吐出原始文本,你可以用純粹的特殊方式來解決這個問題,除了生成代碼的汗水以外,沒有其他的代碼在語法上是有效的。如果你想以AST的形式生成最終結果的C++表示,並重新生成有效的文本,你需要一個prettyprinter,這在技術上並不困難,但仍然需要很多工作來構建, C++。

最後,像DMS這樣的工具存在的原因是爲了提供處理/操作複雜結構(如C++ AST)所需的大量基礎設施。 (解析,分析,轉換,相紙)。你可以嘗試自己複製所有這些機器,但這通常是一個糟糕的時間/成本/生產力折衷。聲稱最好是保持在工具生態系統中,而不是逃避它並自己構建糟糕的版本。如果你之前沒有這樣做,你會很痛苦地發現這一點。

FWIW,DMS已被用於對C++源代碼進行大量的分析和轉換。請參閱Publications on DMS並查看Akers關於「重新設計C++組件模型」的論文。

鐺是基於同一種哲學;有一個工具生態系統。

YMMV,但我會感到驚訝。