2014-07-11 62 views
2

我正在使用Visual Studio C#,並且我需要解析C頭文件來提取關於包含的函數聲明的信息。對於每個函數,我需要名稱,返回類型及其參數。如果可能的話,我希望參數按照它們在函數聲明中出現的順序排列。 我在網上看到過有關使用visual studio標籤或Exhuberant Ctags等的東西。但是從我收集的這些內容來看,這些都不是讓我用C#代碼執行解析的真正選項(我可能會誤解它)? 。我也瀏覽了所有其他相關問題的答案,但他們似乎並不適用於我的情況(我可能只是愚蠢的)。 如果我至少可以得到代表函數聲明的所有代碼行,我會有一個好的開始,並且可以自己手動解析其餘的代碼。 在此先感謝解析C中的C頭文件#

+2

您的最終目標是什麼?你會如何處理解析的數據?你是否試圖自動化一些代碼生成?你想要做pinvokes嗎? – antiduh

+0

考慮使用現有的解析器生成器和現有的語法。這可能讓你開始:http://stackoverflow.com/questions/12527004/use-antlr-to-parse-c-with-c-sharp –

+0

我只是想比較一個頭文件的內容與電子表格其中列出了應該出現在該頭文件中的函數(包括返回類型和參數)。 – stackPusher

回答

2

在一個很深的意義,「解析」 C(頭)文件,並拿起函數聲明中的類型信息,在實踐中,你需要:

  • 一個完整的預處理器(包括添加pecaddillos由供應商,MS在其頭文件中有一些非常奇怪的東西),
  • 一個完整的(語法)解析器/ AST生成器用於感興趣的C方言(沒有「C」這樣的東西;供應商提供了什麼這個版本的編譯器)
  • 一個完整的符號表結構(因爲typedefs是第e實際感興趣的類型)

許多人會建議「編寫自己的解析器(對於C)」。大多數人沒有這樣做;它需要做更多的工作來做到這一點,並且做得比他們明白的要好。如果你不從一個生產級別的機器開始,你將無法完全解決真正的C頭文件。

只是解析純C很難;考慮解析模棱兩可的短語的問題

T*X; 

A classic parser cannot parse this without additional hackery

一般而言,您自己也不能解析C頭文件。您需要具有包含它的源代碼上下文(通常包括編譯器命令行),或者在特定頭文件中使用typedefs,預處理器條件和宏將是未定義的,因此不可擴展到編譯器通常看到的有效C中。

你最好是獲得預先存在的預先測試的機器,將爲您做到這一點。鏗鏘想到的選擇,雖然我不知道它處理MS頭文件。 GCC是一種選擇,但它真的很想成爲一個編譯器,而不是你本地友好的C源代碼分析工具,並且我不確定它是否支持C的MS方言。我們的DMS軟件再工程工具包擁有全部的上述針對C的各種MS方言。

選擇了一個可以真正解析這些標題的工具後,您可能想要東西與收集的標題信息。你對你想要完成的事情很模糊。在提到C#和C的同時,有一個提示是你想從C#代碼中調用C程序,因此需要爲C代碼生成C#等效的API。爲此,您需要機器來處理所提供的類型信息,併爲C#聲明構建「文本」。爲此,您可能會發現您也需要其他支持工具來完成這一部分。這裏GCC是一個完整的非起動器;它不會提供額外的幫助。 Clang和DMS都被設計成定製工具建築機械的庫。

當然,這可能都是沒有意義的,這取決於你想處理多少頭文件文本;它如果只是一個頭文件,手動執行可能是最簡單的。你建議你願意這樣做(「可以手動解析...」)。在這種情況下,您真正​​需要做的就是運行預處理器並解釋輸出。我相信你可以使用GCC和Clang的命令行開關,甚至MS編譯器。我知道DMS可以做到這一點。對於這裏的易於選擇的選項,請參閱How do I see a C/C++ source file after preprocessing in Visual Studio?