2009-09-21 37 views
3

幾個學期回來我有一堂課,我們寫了一個非常基本的方案解析器,最終是一個解釋器。課後,我將解析器轉換爲C++解析器,只要我沒有對預處理器或宏執行任何操作,就可以很好地解析C++。我可以用它來讀取我的類和函數,並做一些簡潔的事情,例如自動生成類讀取器或編寫器,或者從文本文件中設置函數回調。有沒有免費的工具來幫助自動生成代碼?

但是,我的程序非常有限。我相信我可以花一些時間讓它變得更加健壯,做更多漂亮的事情,但是如果已經有更強大的工具可以做同樣的事情,我不想花費時間和精力。我認爲必須有這樣的東西,因爲解析器是編譯器的重要組成部分,但是我沒有看到專門用於自動代碼生成的工具,可以輕鬆地處理代表類,函數和特定於C++的變量。有沒有工具可以做到這一點?

編輯:

希望這會澄清什麼我正在尋找一點點。我在Visual Studio中作爲預建步驟運行該程序。它讀取我的源文件,創建一個類的列表,它們的成員,它們的函數等等,然後用它來生成新的代碼。目前我只是用它來簡化讀寫我的數據結構到純文本文件,但我也可以做其他事情。文件讀取器和編寫器會輸出到純文本格式的.cpp和.h文件中,這些文件包含在我的項目的其餘部分中,就像其他文件一樣。我在尋找的是能夠做類似事情的工具,所以我可以決定是否應該繼續使用我自己的產品或切換到更好的解決方案。我沒有尋找任何能夠生成機器碼或編輯我寫的代碼的東西。

+1

我想這取決於水平。你可以說編譯器執行自動機器代碼生成。 :-) – xpda 2009-09-21 19:28:57

+2

爲了擴大xpda的評論,你想要生成什麼? UI代碼(平臺?),ORM綁定,數據庫模式,業務邏輯驗證等。 – 2009-09-21 19:32:05

+0

聽起來像他想要一個解析器甚至編譯器生成器,爲他提供了一個框架來改變C++的行爲。 – 2009-09-21 19:37:32

回答

6

像ANTLR或者YACC一個完整的解析器建設的工具是必要的,如果你想從頭解析C++,但它是矯枉過正爲您的目的。

它讀了我的源文件,使類,他們的成員,他們的功能等,然後用於生成新的代碼清單。

兩個主要選項:

  • GCC-XML可以生成的類,成員和函數的列表。他們網站上的發行版本比較陳舊,試試CVS版本。我不知道Windows端口的可用性。
  • Doxygen是爲生成文檔而設計的,但它也可以生成XML輸出,您應該可以使用它來做你想做的事情。

目前我只是用它來使之易於閱讀,我的數據結構寫入到一個純文本文件...

這就是所謂的序列化。嘗試Boost.Serialization或者libs11nGoogle Protocol BuffersStack Overflow有進一步的討論。

...但我也可以做其他事情。這種自動代碼生成的其他很酷的應用包括反射(在運行時檢查對象的成員,使用duck typing與C++等),並生成用於從腳本語言調用C++的包裝。對於C++反射庫,請參閱Reflex。有關生成腳本語言包裝的示例,請參閱Boost.PythonSWIG

+1

謝謝。爲了記住GCC-XML的名字,我一直在敲我的腦袋10分鐘! – Duck 2009-09-21 20:14:46

2

C++ FAQ Lite提到了C++的YACC語法。 YACC是一個老派的解析器,用於生成解析器輸出,笨拙而難於學習,但功能非常強大。現在,你會使用Gnu Bison而不是YACC。

+0

GNU的人放棄了使用Bison來解析C和C++。 – 2009-09-30 09:02:26

+0

大概是個好主意。確切地說,爲什麼C語法是我可能永遠不會知道的方式。 – 2009-09-30 20:01:03

2

不要忘了Cog。它需要你瞭解Python。實質上,它將Python腳本的輸出嵌入代碼中。使用起來非常簡單,但它採用與ANTLR完全不同的方法,其目的有所不同。

0

Mozilla爲這類事情開發了Pork。我不能說它很容易使用(或甚至建立),但它正在生產中。

1

answered一個類似的問題(再分割源文件到單獨的頭和cpp文件)通過建議使用lzz

lzz有一個非常強大的C++解析器,它爲除了函數體之外的所有內容構建表示。只要您不需要函數體的內容,您就可以修改'lzz',以便執行所需的生成步驟。

0

我已經用專業的Nvelocity引擎與C#結合,作爲編碼的一個預先步驟,具有非常好的結果。

相關問題