你没有注明的是你想要做什么样的“分析”。大多数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