c++解析器的当前技术状态
Current state of the art for c++ parsers?
我知道这是一件非常困难的事情,因为有#ifdef, #define和模板,但是c++解析器的技术状态是什么(无论是开源的还是专有的?)
我的意思是,对于一个大学项目,我正在考虑创建一个分析c++代码库的工具,但是似乎很难找到一个好的解析器。
我应该放弃并满足于java解析器吗?类似地,java解析器的最新技术是什么?那么c#呢?
此外,将g++的解析器部分从它中分离出来是否会为代码分析的目的而工作,或者这样做是否太过努力?
你很幸运!Clang在最近几个月才开始能够解析大多数c++程序:http://clang.llvm.org/它是少数几个真正能够解析大多数c++的开源解析器之一。(主要是GCC和CLANG,我听到Oink(?)有时会变得很好)并且它被构建为ide之类的库,甚至有支持代码重写的架构。
有一些专有的解析器可以完成这项工作,但是如果没有源代码访问,它们都不能真正使用。
关于撕裂gcc,这对代码分析来说不是很实用,这取决于你想做什么,你可以使用新的插件架构来获得一些有用的信息,但是在解析的早期阶段,它会做一些叫做术语折叠的事情,解析器本身会优化出像"x = x"这样的东西(一个简单的例子)编译器的其他方面期望这种情况发生,所以它不是微不足道的删除。这样就使得gcc在源代码重写方面几乎毫无用处。
对于c++,您可以使用GCC与-fdump-translation-unit
&
见:http://www.manpagez.com/man/1/g + +/
如果你可以用g++编译一些东西,那么你可以从它得到树
行业标准c++解析器,在EDG的c++前端广泛用于编译器。这方面我没有经验;但我知道它可以处理各种各样的c++方言。我知道你可以免费得到它用于研究目的。
开源标准是GCC编译器。我听说它很难理解和修改。
在其他答案中提到了CLANG。我在这里没有经验。我的理解是,它是相当复杂的,特别是在支持分析方面。
我们专有的DMS软件重构工具包具有完整的c++解析器,具有完整的名称和类型解析,预处理器扩展(或保留,其他工具不会这样做)。c++前端处理几种c++方言:ANSI、GCC、MS Visual Studio。正如你可能猜到的,我在这方面有很多经验。
DMS/CppFrontEnd已被用于在c++代码上执行程序分析以及大量程序源到源的转换,这是由DMS的模式解析器启用的,它将解析任何c++代码片段。我相信其他c++前端不提供源到源的转换。有了这些,你可能会程序化地破解AST,但这是相当不方便的,因为你必须知道精确的AST结构,而对于c++来说,这是相当复杂的。
DMS还具有完整的C, Java和COBOL前端,具有名称和类型解析以及控制和数据流分析。它有许多其他语言的解析器(但没有名称和类型分析),包括c#。据我所知,其他的"c++解析器"不能做到这一点,从定义上来说。可以对其中任何一个应用源到源转换,或者对它们的任何混合应用。
clang值得研究。它很快,而且他们提供api来挂钩到他们的后端。
Xcode 4使用clang来完成解析、错误报告/检测、自动完成和fix-its等任务。
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 如何避免LED在循环状态变化中闪烁?
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- C++ 关于指针取消引用的技术问题
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- c++解析器的当前技术状态