如何解析c ++头文件的集合?

时间:2010-12-12 11:07:37

标签: c++ visual-studio parsing reflection abstract-syntax-tree

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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

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

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

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