我正在尝试开发一种代码生成器来帮助对遗留的 C/C++ 混合项目进行单元测试。我没有发现任何一种独立的工具可以从声明中生成存根代码。所以我决定建一个,应该不会那么难。
拜托,任何人都可以给我一个标准的语法链接,用 yacc 语言更好地描述。
希望我不是在重新发明轮子,在这种情况下请帮助我。
最好的问候,凯文
来自C++ FAQ Lite:
您需要的主要 yacc 语法来自 Ed Willink。Ed 相信他的语法完全符合ISO/ANSI C++ 标准,但他不保证:“语法没有,”他说,“被用于愤怒。” 您可以获得没有动作例程的语法或带有虚拟动作例程的语法。您还可以获得相应的 lexer。对于那些对他如何实现无上下文解析器感兴趣的人(通过推动所有歧义以及在解析完成后进行少量修复),您可能需要阅读他论文的第 4 章。
还有一个非常古老的 yacc 语法,它不支持模板、异常和名称空间;加上它以一些微妙的方式偏离了核心语言。您可以在此处或此处获得该语法。
I've recently found some grammar files for C++ (C++ 1998: ISO/IEC 14882:1998 and C++ 2008: ISO/IEC SC22/WG21 N2723=08-0233) at the grammarware website. The grammars are represented in Enahnced BNF, DMS BNF, BGF, SDF and Rascal notation. It's a pity, though, that the C++ grammars don't seem to get updated (no C++2003 or C++11).
Jared 的链接是您可以获得的最接近上下文无关语法的东西。某些事情确实需要延迟到以后,但这是通过一些比 C++ 的上下文敏感语法更好的论点。
更糟糕的是,C++1x 将显着复杂化语法。为了达到对 C++ 的完美解析,解析器需要实现足够多的标准来正确进行重载解析,包括模板参数推导,这反过来又需要概念机制、lambdas,实际上几乎所有的语言,除了两阶段名称查找和异常规范,如果我没记错的话,不需要实际实现来成功解析程序。
实际上,如果你能解析 C++,你就已经完成了编译器的一半。
对于另一种方法,您可以考虑搭载现有编译器。
GCC-XML会将 C++“编译”成包含大量有用信息的 XML 文件;这可能足以满足您的目的。
不幸的是,GCC-XML 只维护了 1/4,让它工作可能是……有趣的。祝你好运,如果你走这条路。
我们的 DMS Software Reengineering Toolkit 可以通过功能强大的全功能 C++ 解析器获得。请参阅 http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html 这会构建 AST 和符号表,并且可以推断任何表达式的类型。DMS 使人们能够对 C++ 代码进行任意分析和转换。
一种“简单”的转换是检测代码以收集测试覆盖率数据;我们将其作为 COTS 工具提供。请参阅本文以了解 DMS 是如何做到的: http ://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf
编辑 2013 年 9 月(这个答案有点陈旧):DMS 的 C++ 解析器/名称解析/控制流分析在 ISO-、GNU- 和 Microsoft 变体中处理完整的 C++11。它还将解析(并保留)包含大多数预处理器条件的源代码。与 GCC 或 Clang 不同,它具有驱动解析过程的显式语法。