是否可以从VS插件访问VC++代码DOM?

Rob*_*cks 100 .net codedom c++-cli visual-studio visual-c++

用于VC++的Visual Studio IntelliSense包括"完整的" EDG C++解析器(也被英特尔和其他人使用).由于插件可以访问C#Code DOM(如果我错了,请纠正我),C++ Code DOM是否也可以访问?这可以用于分析VS环境中的开放VC++项目吗?

Rob*_*cks 22

VISUAL C++重构扩展能够重命名成员在项目范围内.它由MS构建,但显然他们使用内部Code DOM来实现这一目标.所以有可能,我只是不知道如何.

CppLister扩展能够读取由VS创建的智能感知数据库列出一个类中的各个成员.

您始终可以使用开源Clang C++解析器(实际上是编译器)并将AST读入C#对象模型.有关C#绑定到Clang,请参阅CppSharpClangSharp.


Ira*_*ter 8

我不确定"C++ Code DOM"是什么,如果它存在的话.重要的是MSVS正在使用EDG前端来解析和确定符号的含义,以支持MSVS IDE操作.EDG IIRC建立了代表该计划的内部数据结构; 我没有理由相信这些数据结构是"C++代码DOM",或者它们对您是可见的,或者您可以在MSDN上找到它们.

您真正陈述的问题是您想要分析C++源代码.我同意,拥有EDG前端信息将是一个重要的帮助; 你真的 真的不想尝试编写自己的C++解析器(你需要经过解析后的很多东西,谷歌我的论文"解析后的生活").

所以你有以下选择:

  • 在MSVS中找到EDG机械的大门.既然你没有很多运气,而且MS似乎没有任何文件证明这是可用的,你可能不会有这么多运气.如果我穿着MS的鞋子,我就不会公开; 这只会是另一个支持头痛,而且是一个甚至不属于他们的软件.
  • 使用直接来自EDG的商用EDG前端.我的理解是他们免费提供个人使用许可.(我的理解可能是错的).这样您就可以跳过MS对访问的任何限制......但代价是必须自己配置EDG前端.缺点:EDG希望成为编译器的前端,而不是分析器的前端.这种区别可能看起来微妙,但它可能会咬你.例如,我怀疑EDG抛弃了评论; 编译器前端不需要它们.如果要检查分析仪中的注释,这可能是一个真正的问题.
  • 使用Clang.这是一个开源的C++解析器,旨在用于各种程序分析目的以及前端C++编译器.我没有这方面的经验,但似乎很好的思考,似乎提供了很多设施.我不知道它是否对C++的MS方言有特定的支持.
  • 使用另一个商业前端,我们的(DMS)C++前端.作为这个的架构师,我很确定它经过深思熟虑(包括对MS Visual C++的支持); 使用它来执行复杂的C++分析和转换任务有特定的经验.与EDG不同,它旨在支持分析,转换和生成(例如,它捕获注释甚至文字的基数,以便可以正确地重新生成它们).基础,DMS,内置了许多机器来支持自定义分析:AST和符号表构造,属性语法,数据流框架,AST级别的过程内控制和数据流分析,BDD管理,源模式匹配,源到 - 源转换.Clang和EDG提供AST和符号表构造; Clang(但我不认为EDG)有流量分析(在LLVM级别),而不是AST级别的流量分析(AFAIK).Clang和EDG都没有提供源模式/转换功能,因此哪个更好取决于您的长期任务.与其他选项相比,我们的C++前端不是开源的或免费的; 人们可以获得研究许可证.

  • C#中的DOM表示用于代码生成的"具有错误分辨率的AST".你不能用C#dom提供的那种分辨率来真实地分析C++程序. (3认同)
  • 基本上,"DOM"是针对AST的HTML.它确实假设有一个规范的语法,而C++编译器通常使用稍微不同的语法.(例如,创建更好的错误消息.). (2认同)