2011-12-12 81 views
3

其時間問:我需要一個C預處理器庫。C源碼分析

對此有一個相同的question,但我不認爲依靠像cpp這樣的外部應用程序將解決我的需求。

我想分析一個支持C預處理器的C風格語言。我需要生成的信息是基礎源代碼依賴的預處理器符號列表。或者,我需要解決條件預處理器指令,給定一組定義的預處理器符號幷包含路徑。

我最初的解決方案是我自己的基於正則表達式的實現,但是(如你所想象的)它不能在所有情況下工作。宏替代,多重括號,字符串連接,宏參數就是我將要面對的事情的例子。你可以找到我的(部分)實現here。因此,我正在尋找一個庫(最好在.NET上,但它不是必需的),它允許我獲取有關在源代碼中聲明(或應該聲明)的所有預處理器符號及其定義的信息(因此他們之間的依賴關係)。

有沒有解決方法?


主要目標是管理OpenGL着色語言源。其中一種用於管理這些源的技術是預處理器條件(使用標準C預處理器):一種單一來源,可在不使用運行時條件(提高性能)的情況下獲取許多着色器程序。

預處理器信息用於源分析,源編輯(特別是語法灰淡度功能)和(更重要的)編譯着色器對象高速緩存。

編譯着色器對象緩存允許通過緩存組成未來程序的對象(避免重複編譯相同的源)來加快程序鏈接。緩存基於源文本和編譯參數(實際上是定義的預處理器符號)。實際上,應用程序應分析源代碼以獲取條件中使用的符號列表:此列表用於計算緩存哈希值。

+0

能否請你解釋爲什麼* * CPP不能搔抓您的特定癢?這將是提出不同解決方案的非常重要的信息。 – thiton

+0

你提到你更喜歡基於.NET的東西。有什麼特別的原因嗎? cpp *是C預處理程序,它是GCC程序集的一部分,我記得可以在Windows上使用cygwin。 (我假設,因爲你問.NET,你在Windows上,請隨時糾正我。) –

+0

@TaylorPrice正確。但這不是要求:我可以通過外部過程來完成一些IPC。 – Luca

回答

3

clang項目提供了可以處理許多C變體的lexing和預處理的liblex。

+0

看起來很有希望。代碼對我來說很舒服(結構化和文檔化)。 – Luca

0

我們的DMS Software Reengineering Toolkit是通用程序分析和轉換技術。

它可以配置爲處理任意語言,並且對於包括C和C++在內的許多語言都具有健壯的前端,並且包含完整的預處理器。這些預處理器可以配置爲正常擴展,或者儘可能避免擴展,以便解析器儘可能多地在AST中收集代碼結構,包括預處理器定義,條件和宏調用。雖然DMS本身是作爲二進制庫和一組工具提供的,但前端以源代碼的形式提供,可以完成任何方面的定製,包括預處理器,詞法分析器,解析器,符號表構造和流分析器。

它可能是一個很好的平臺,用於着色器源代碼的分析器。你想用C前端來訪問預處理器。我不知道着色器代碼是否像C;如果是這樣,你可以彎曲C語言,並獲得相當多的相關基礎設施,包括控制和數據流分析。

+0

非常專業。 – Luca