2010-12-12 49 views
1

我在一个项目中工作,我想在C++中进行反射,所以经过研究,我发现最好的方法是解析头文件以获取XML格式的抽象语法树并在反射中使用它。我尝试了很多工具,但没有一个与coco,cint,gccxml等visual C++ 2008或visual C++ 2010兼容。请尽快重播如何解析C++头文件的集合?

回答

2

Visual Studio已经解析了项目中的所有代码(智能感知功能)。您可以使用Visual C++ Code Model进行访问。

2

我们的C++ front end能够解析许多C++的方言,包括GNU和MS。它为AST和符号表建立了编译器数据结构,并提供了为C++“做反射”所需的信息。将分析树导出为XML文档相当简单。符号表信息可以通过遍历符号结构以XML形式导出。

人们总是希望XML格式的AST和符号表数据,我猜想他们可以将其读入DOM结构或使用XSLT操纵它。这个想法有两个严重的缺陷:1)XML数据的庞大数量是巨大的,生成/重读它只是增加了很多时间2)使这些结构可用会使得“容易”做...某事...

我们认为人们真正想要做的是分析代码和/或转换代码(通常基于分析)。这就要求该工具无论是以何种方式提供对程序结构的访问权限,以便“更容易”分析和转换。例如,如果您决定修改AST,您将如何重新生成源文本?

我们已经构建了DMS Software Reengineering Toolkit,以提供解析,分析,转换,相容性(“再生源”)的一种通用支持。 DMS具有各种语言(C++,C,Java,COBOL,Python等)的前端,并提供了一组有用的标准服务,用于在代码上构建自定义分析器/转换。冒着大胆冒险的风险,我们花了很长时间考虑实施有用的机制来涵盖这些任务,就像MS花了很长时间来确定Windows应该是什么一样。你可以尝试复制这种机制,但期望它的成本很高(我们一直在为DMS工作15年),或者你可以闭上你的眼睛,假装你可以拼凑在一起做你想象的你需要做的事情(大多数情况下你会发现在实践中这是不够的)。

由于这种对“程序操纵服务”的普遍需求,我们的C++前端托管在DMS之上。

拥有C++前端的DMS已被用于构建各种标准软件工程工具(测试覆盖率,分析器)以及对代码进行大规模更改(网站上有关于如何使用DMS的论文大规模重新架构的飞机任务软件)。

编辑7/8/2014:我们的前端现在可以处理完整的C++ 11和部分C++ 14,包括函数/过程/方法的控制和数据流。