C++ 用于创建C/C++;分析器/分析器

C++ 用于创建C/C++;分析器/分析器,c++,c,parsing,yacc,lex,C++,C,Parsing,Yacc,Lex,有哪些好工具可以快速开始解析和分析C/C++代码 特别是,我正在寻找处理C/C++预处理器和语言的开源工具。这些工具最好使用lex/yacc(或flex/bison)作为语法,而且不会太复杂。他们应该处理最新的ANSI C/C++定义 以下是我到目前为止发现的,但还没有详细研究(想法?): -老式C分析仪。但似乎没有完成完整的解析。被描述为寻找C函数的光荣的“grep” -大家最喜欢的开源编译器。非常复杂,但似乎都能做到。有一个创建GCC扩展的相关项目名为,但自GCC4.1(2006)以来一直

有哪些好工具可以快速开始解析和分析C/C++代码

特别是,我正在寻找处理C/C++预处理器和语言的开源工具。这些工具最好使用lex/yacc(或flex/bison)作为语法,而且不会太复杂。他们应该处理最新的ANSI C/C++定义

以下是我到目前为止发现的,但还没有详细研究(想法?):

  • -老式C分析仪。但似乎没有完成完整的解析。被描述为寻找C函数的光荣的“grep”
  • -大家最喜欢的开源编译器。非常复杂,但似乎都能做到。有一个创建GCC扩展的相关项目名为,但自GCC4.1(2006)以来一直没有更新过
  • -纯机械手。(摘自页面:“本项目的目的是 为C/C++源代码的分析和操作提供类库 PUMA提供了用于扫描、解析,当然还有操作C/C的类++ 资料来源。”)。这看起来很有希望,但自2001年以来就没有更新过。显然,PUMA已被纳入,但即使是这个项目自2006年以来也没有更新过
  • 各种C/C++原始语法。你可以得到,但这是自1997年以来一直没有维护。谷歌搜索一下其他基本的lex/yacc语法,就可以作为一个起点
  • 还有其他的吗
我希望以此为起点,将C/C++源代码翻译成一种新的玩具语言

谢谢! -马特


(添加2/9):只是澄清一下:除了C/C++代码本身之外,我还想从预处理器中提取语义信息。我不希望“#define foo 42”消失在整数“42”中,但仍然附加在名称“foo”上。不幸的是,排除了一些先运行预处理器,只交付C/C++解析树的解决方案)

C++的语法有点臭名昭著。但是C++的语法要求任意的向前看。
对于我想象中你可能正在做的事情,我会考虑黑客攻击Gnu CC或。尤其是Gnu CC,它非常彻底地分离了语言生成部分,因此您最好构建一个新的g++后端。

如何使用一些更容易理解的东西,如或

看看如何工作,完整的源代码是可用的,并且它是基于flex的

一个误导性的候选者是,它是一个免费的基于Windows的解析器工具包,专门用于创建转换器。他们支持的语言列表是指可以实现解析器的语言,而不是支持的解析语法列表

<> P>他们只有C和C的语法,没有C++,

根据你的问题可能是你的答案。 基本上,它使用GCC解析源代码,然后提供易于理解的解析树XML。


使用GCXML,你是一次性完成的。

< P>解析C++是非常困难的,因为语法是不可判定的。引述:

极其复杂的语法

“应该”字面上解释,因为所有流行语言都有(或几乎“无上下文”文法),而C++有语法。如果您喜欢编译器和解析器,您可能知道这意味着什么。如果你不喜欢这类东西,那么解析C++会有一个问题:is

aabb(CC)对象定义还是函数声明?事实证明,答案在很大程度上取决于语句前的代码——“上下文”。这表明(在直觉上)C++语法对上下文非常敏感。

解析器生成器具有用于C/C++以及预处理器的功能。我从来没有使用过它,所以我不能说它的解析如何完成C++。ANTLR本身在一些场合对我来说是一个有用的工具,可以解析更简单的语言。

不久前,我尝试编写一个工具,自动为c文件生成单元测试

对于预印,我把文件通过GCC。输出很难看,但是您可以很容易地跟踪预处理文件中原始代码的位置。但为了你的需要,你可能还需要别的东西

我将其用作C解析器的基础。它是开源的,使用lex和yacc。这使得在不完全理解lex和yacc的情况下,很容易在短时间内启动和运行

我还编写了一个C应用程序,因为lex&yacc解决方案无法帮助我跨函数跟踪功能并一次性解析整个函数的结构。它在很短的时间内变得不可维护,被抛弃了。

击败了我知道的所有其他的C++解析,即使它不是100%的兼容。我是个歌迷。有一个模块可以打印出C++,所以这可能是你的玩具项目的一个好的起点。

< P>你可以查看使用LLVM进行解析。

完全支持C++现在

< P> ./P> 有一个Boost/Spirit框架,几年前他们就有了,但现在是

完全正确地分析ISC++是微不足道的,实际上还有许多相关的工作。但是,这是一个天生复杂的工作,不容易完成,而不重写完整的编译器前端,理解所有C++的“强”和“/强”预处理器。Spirit公司提供了一种称为“wave”的预处理器实现

你说,你可能想看看(埃尔莎为基础),它是一个C++解析器工具包,专门用于源代码转换的目的,它被Mozilla项目用来做大规模的静态源代码分析和自动代码重写,最有趣的部分是它不仅支持大部分C++,还有预处理器本身

另一方面,确实有一个专有的解决方案:EDG前端,它可以用于几乎所有的C++相关的EFF。