我理解这是一项非常难的事情,#ifdef,#define和模板是什么,但c ++解析器的最新技术是什么(无论是开源还是专有?)。
我的意思是,对于一个大学项目,我正在考虑创建一个分析c ++代码库的工具,但似乎很难找到一个好的解析器。
我应该放弃并解决java解析器吗?同样,java解析器的最新技术是什么?那怎么样?#
此外,除了它之外,还会将g ++的解析器部分用于代码分析,或者是否需要付出太多努力?
答案 0 :(得分:6)
你很幸运! Clang刚刚开始能够在过去几个月内解析大多数c ++程序:http://clang.llvm.org/它是为数不多的能够解析大部分C ++的开源解析器之一。 (大多数只是GCC和CLANG,我听说Oink(?)有时可以很好用)它可以被IDE等用作库,甚至可以构建支持代码重写的架构。
有一些专有的解析器可以完成工作,但是如果没有源访问权限,它们都不可用。
关于拆分gcc,根据你要做的事情,这对于代码分析来说不太实用,你可以使用新的插件架构从中获取一些可用的信息,但是在解析的早期阶段,它做一个叫做术语折叠的东西,解析器本身会优化诸如“x = x”之类的东西(一个简单的例子)编译器的其他方面都希望这种情况发生,所以删除它并不容易。因此,使gcc几乎无用于任何类似于源重写的东西。
答案 1 :(得分:3)
对于C ++,您可以将GCC与-fdump-translation-unit
&朋友可以选择从中获取AST。
请参阅:http://www.manpagez.com/man/1/g++/
如果你可以用g ++编译一些东西,你可以从中获取树。
答案 2 :(得分:2)
行业标准C ++解析器,在EDG's C++ front end中广泛用于编译器。我对此没有经验;但我知道它处理各种各样的C ++方言。我知道你可以免费用于研究目的。
开源标准是GCC compiler。我听说很难理解和修改。
其他答案中提到了CLANG。我没有经验。我的理解是,它在支持分析方面相当复杂。
我们的专有DMS Software Reengineering Toolkit有full C++ parser with full name and type resolution,预处理器扩展(或保留,其他工具不会这样做)。 C ++前端处理C ++的几种方言:ANSI,GCC,MS Visual Studio。正如你可能猜到的那样,我对这个经历有很多的经验。
DMS / CppFrontEnd已被用于执行程序分析以及C ++代码的大规模源程序到源代码转换,由DMS的模式解析器启用,它将解析C ++代码的任何片段。我相信其他C ++前端不提供源到源的转换。有了这些,你可能会在程序上破解AST,但这非常不方便,因为你必须知道精确的AST结构,对于C ++来说这非常复杂。DMS还具有完整的C,Java和COBOL前端,包括名称和类型分辨率以及控制和数据流分析。它有许多其他语言的解析器(但不包括名称和类型分析),包括C#。 AFAIK,其他“C ++解析器”不能这样做,根据定义。可以对这些中的任何一个或这些中的任何混合应用源到源转换。
答案 3 :(得分:0)
Xcode 4使用clang执行诸如解析,错误报告/检测,某些情况下的自动完成以及修复它等任务。