c++解析器的当前技术状态

Current state of the art for c++ parsers?

本文关键字:技术 状态 c++      更新时间:2023-10-16

我知道这是一件非常困难的事情,因为有#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等任务。