2014-07-24 97 views
3

我想解析C++代碼,並創建一個AST。我想要做的是提取一些簡單的反射信息(類名稱,成員變量及其類型等)。我不需要編譯代碼或生成二進制文件。我正在尋找最簡單的方法來做到這一點。理想情況下,我想要一個小的解析器,在一個靜態庫中,沒有依賴關係。如何解析C++來創建AST?

我一直在環顧四周,它似乎是一個野牛分析器可能能夠爲我做到這一點。我試圖找到一個開源的解析器,但所有的谷歌會給我的是C++的Bison包裝器,而不是C++的Bison解析器。鍵入「C++解析器」也會失敗,通過爲C++編寫的其他所有解析器提供結果。

有沒有一個開源項目能夠滿足我的需求?

+7

鐺前端。 C++的語法不是上下文無關的;解析和語義分析是相連的,你確實需要大部分的編譯器。 –

+0

沒有「小C++解析器」這樣的東西。語言是巨大的。 –

+0

@BenVoigt:實際上,存在各種C++語法,用於以無上下文的方式解析C++(請參閱我們的使用GLR解析器的工具)。你會得到含義不止一個句法解釋的歧義節點,但這意味着你可以解析格式良好的C++文件,而不必具有所有的定義。 (預處理器仍然有麻煩,但我們也有辦法處理這個問題)。 –

回答

7

clang可以這樣做:

clang -Xclang -ast-dump -fsyntax-only test.cc 

see the docs

+0

應該提到'stdout'的輸出和錯誤顯然是'stderr'。 – Rapptz

+0

或者,嘗試libclang python綁定 - 解析ast轉儲並不那麼容易。 –

+0

在這一點上,鏗鏘似乎是最有吸引力的選擇。我認爲當它已經以二進制格式存儲在編譯器中時,嘗試將ast-dump解析爲文本是沒有道理的,但我認爲ast-dump函數的源頭是一個很好的開始。 – bitwise

3

您可以使用GCC-XML生成一個相當容易解析大多數(但不是全部)C++代碼的XML表示。

+0

我看了看GCC-XML,好像它可以做我想做的事情,但似乎取決於在目標機器上安裝了某些版本的其他編譯器。截至目前,它似乎只支持visual studio 2010,這是不可接受的。快速瀏覽一下這個網站似乎表明它不支持clang。 – bitwise