【问题标题】:Current state of the art for c++ parsers?c++ 解析器的最新技术?
【发布时间】:2011-04-29 22:08:37
【问题描述】:

我知道这是一件非常困难的事情,#ifdef、#define 和模板会怎样,但 c++ 解析器的最新技术是什么(开源还是专有?)。

我的意思是,对于一个大学项目,我正在考虑创建一个用于分析 C++ 代码库的工具,但似乎很难找到一个好的解析器。

我应该放弃并满足于 java 解析器吗?同样,Java 解析器的最新技术是什么?那么c#呢?

另外,为了代码分析的目的,将 g++ 的解析器部分分离出来是否会起作用,或者这样做是否需要付出太多努力?

【问题讨论】:

  • 如果你要拆掉一个 C++ 解析器,你可能想看看 Clang,他们的代码库比 GCC 的疯狂得多
  • “什么是最先进的技术”这个问题对我来说似乎相当模糊。您是否在询问人们对哪种开源解析器最好的看法?就 C++ 的复杂性而言,解析它并不难,但某些语言元素可以。我的问题是您需要能够分析什么样的信息。
  • #ifdef#defineC++ 解析器必须解决的所有其他问题相比是微不足道的。 (但模板不是。)
  • 编译器甚至看不到 #ifdef #define 等。这就是为什么它们被称为预处理器指令。
  • @Jonathan:“解析它并不难……”什么?坦率地说,如果不完全解析它,你根本无法分析 C++。

标签: c++ parsing compiler-construction


【解决方案1】:

你很幸运!在过去的几个月里,Clang 刚刚开始能够解析大多数 C++ 程序:http://clang.llvm.org/ 它是真正能够解析大部分 C++ 的少数开源解析器之一。 (主要是 GCC 和 CLANG,我听说 Oink(?) 有时会变得相当好)而且它被构建为被 IDE 等用作库,甚至具有支持代码重写的架构。

有一些专有的解析器可以完成工作,但是没有源代码访问它们都不能真正使用。

关于拆分 gcc,这对于代码分析不是很实用,具体取决于您要执行的操作,您可以使用新的插件架构从中获取一些可用信息,但是在解析的早期阶段,它做了一些称为术语折叠的事情,解析器本身将优化诸如“x = x”之类的东西(一个简单的例子)编译器的其他方面预计会发生这种情况,因此删除它并非易事。因此 gcc 对于任何类似源代码重写的事情几乎毫无用处。

【讨论】:

  • 如果仅使用 clang 自动完成并没有那么慢:(
  • 是吗?我怀疑它是 clang 本身固有的,我没有使用太多,但是新的 XCode 4 完成似乎相当活泼。你用的是 Emacs 模式吗?
  • 我将它与 VIM 插件一起使用,所以它可能是一个问题。我认为它不会在每次完成时重新解析所有内容。
【解决方案2】:

对于 C++,您可以使用带有 -fdump-translation-unit 和好友选项的 GCC 来从中获取 AST。

见:http://www.manpagez.com/man/1/g++/

如果你可以通过 g++ 编译一些东西,那么你可以从中得到树。

【讨论】:

    【解决方案3】:

    业界标准的 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++ 解析器”无法做到这一点。可以将源到源的转换应用于这些中的任何一个,或这些的任何混合。

    【讨论】:

    • Clang 有预处理器扩展和保留。
    【解决方案4】:

    clang 值得研究。它速度很快,而且他们提供了 api 来连接到他们的后端。

    Xcode 4 将 clang 用于解析、某些情况下的错误报告/检测、自动完成和修复等任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多