你沒有註明的是你想要做什麼樣的「分析」。大多數C++分析都要求你有準確的符號表數據,這樣當你遇到符號foo時,你有一些想法是什麼。 (你在技術上甚至不知道什麼+沒有這樣的符號表!)你也需要泛型類型信息;如果你有一個表達式「a * b」,結果的類型是什麼?擁有「名稱和類型」信息幾乎是任何你想做的分析的關鍵。
如果你堅持叮噹,那麼這裏還有其他答案。我不知道它提供了名稱和類型解析。
如果您需要需要名稱和類型分辨率,那麼另一種解決方案是DMS Software Reengineering Toolkit。 DMS爲分析,分析,轉換和解析(從編譯器數據結構中重新生成源代碼)提供了類似編譯器的編譯器。 DMS的工業強度C++前端(它也有許多其他語言前端)根據ANSI標準以及GCC和MS VC++方言提供全名和類型解析。
代碼轉換可以通過DMS提供的抽象語法樹接口實現,也可以通過用目標語言(本例中爲C++)的表面語法編寫的模式定向程序轉換規則來實現。這裏有一個使用規則語言的簡單轉換:
domain Cpp~GCC3; -- says we want patterns for C++ in the GCC3 dialect
rule optimize_to_increment(lhs:left_hand_side):expression -> expression
" \lhs = \lhs + 1 " -> " \lhs++" if no_side_effects(lhs).
這隱式地運行在DMS構建的AST上,以修改它們。有條件的 允許您查詢模式變量的任意屬性(在本例中爲lhs),包括名稱和類型約束(如果您希望的話)。
DMS已被多次用於非常複雜的程序分析和C++代碼轉換。我們使用DMS以相當明顯的方式構建C++代碼,從而構建C++測試覆蓋工具。在網站上,有一篇文章描述了DMS如何用於重構軍用飛機任務軟件的大型產品線的架構。這種活動通過應用大量的模式定向轉換(如上所述),將C++以一種體系結構形式注入另一種體系結構中。
這可能很容易實現你的儀器。而且你不必等待它成熟。
我傾向於認爲clang必須提供名稱和類型解析信息 - 他們還要如何編譯到LLVM並提供有用的錯誤消息(在這一點上比gcc更有用)。 – aneccodeal 2010-03-11 05:51:29
當然,clang-the-compiler有某種符號表。它是否可用AST以便利的形式?鏗鏘編譯器甚至構建完整的AST?它是否可以同時用於多個編譯單元?如果我正在設計這樣一個工具(並且已經完成了DMS),我會怎麼做,但這不同於他們實際做的。我只是不知道。 – 2014-07-07 20:07:02