Mat*_*all 49 c c++ parsing yacc lex
有什么好的工具可以快速开始解析和分析C/C++代码?
特别是,我正在寻找处理C/C++预处理器和语言的开源工具.优选地,这些工具将使用lex/yacc(或flex/bison)用于语法,并且不会太复杂.他们应该处理最新的ANSI C/C++定义.
这是我到目前为止所发现的,但没有详细查看它们(想法?):
我希望将此作为将C/C++源代码翻译成新玩具语言的起点.
谢谢!-Matt
(已添加2/9):只是澄清:除了C/C++代码本身之外,我还希望从预处理器中提取语义信息.我不希望"#define foo 42"消失在整数"42"中,但仍然附加到名称"foo".不幸的是,这排除了几个首先运行预处理器并且只提供C/C++解析树的解决方案.
Ada*_*eld 35
解析C++非常困难,因为语法是不可判定的.引用Yossi Kreinin:
非常复杂的语法
"Outstandingly"应该从字面上解释,因为所有流行语言都有无上下文(或"几乎"无上下文)的语法,而C++有不可判定的语法.如果您喜欢编译器和解析器,您可能知道这意味着什么.如果你不是这样的话,有一个简单的例子说明解析C++的问题:是
AA BB(CC);
对象定义还是函数声明?事实证明,答案在很大程度上取决于声明之前的代码- "上下文".这表明(在直观上)C++语法非常依赖于上下文.
Sea*_*iff 17
所述ANTLR解析器生成具有语法为C/C++以及预处理器.我从来没有使用过它,所以我不能说它对C++的解析会有多完整.ANTLR本身对我来说是一个很有用的工具,用于解析更简单的语言.
有Boost/Spirit框架,几年前他们确实采用了实现C++解析器的想法,但它远未完成.
完全正确地解析ISO C++远非微不足道,实际上还有很多相关的工作.但是,如果不重写完整的编译器前端来理解所有C++ 和预处理器,那么这是一项本身就很复杂的工作,并不容易实现.一个名为"wave"的预处理器实现可以从Spirit人员那里获得.
也就是说,您可能想看看pork/oink(基于elsa),这是一个专门用于源代码转换目的的C++解析器工具包,它正被Mozilla项目用于大规模静态源代码分析和自动代码重写,最有趣的部分是它不仅支持大部分C++,还支持预处理器本身!
另一方面,确实有一种可用的专有解决方案:EDG前端,可用于几乎所有与C++相关的工作.
就个人而言,我会查看在Mozilla上使用的基于elsa的pork/oink套件,除此之外,FSF现在已经批准了使用运行时库许可证的gcc插件工作,因此我认为事情会发生变化一旦人们可以使用二进制插件轻松地利用基于gcc的C++解析器进行此类目的.
所以,简而言之:如果你有钱:EDG,如果你现在需要免费/开源的东西:else/oink相当有前途,如果你有时间,你可能想要为你的项目使用gcc.
C代码的另一个选择是cscout.