我正在尝试开发一种代码生成器,以帮助对遗留的C/C++混合项目进行单元测试。我没有找到任何独立的工具可以从声明中生成存根代码。所以我决定自己编写一个,这应该不是很难。
请问有人能够指出一个标准语法链接,最好用yacc语言描述的?
希望我没有重复造轮子,在那种情况下请帮助我。
此致, Kevin
来自C++ FAQ Lite:
您需要的主要yacc语法来自Ed Willink。Ed认为他的语法完全符合ISO / ANSI C ++标准,但他不保证:“他说”语法尚未“被愤怒地使用。您可以获取没有操作例程的语法或带有虚拟操作例程的语法。你也可以获得相应的词法分析器。对于那些对他如何实现无上下文解析器(通过将所有歧义加上少量修复推到后面进行解析完成)感兴趣的人,您可能想阅读{{link1:他的论文}}第4章。还有一个非常古老的yacc语法,不支持模板、异常和命名空间;此外,它在某些微妙的方式中偏离了核心语言。您可以在{{link2:这里}}或{{link3:这里}}获取该语法。我最近在grammarware网站上找到了一些C++语法文件(C++ 1998: ISO/IEC 14882:1998和C++ 2008: ISO/IEC SC22/WG21 N2723=08-0233)。这些语法使用增强型BNF、DMS BNF、BGF、SDF和Rascal符号表示。不过遗憾的是,C++语法似乎没有得到更新(没有C++2003或C++11版本)。
还有另一种方法,您可以考虑依托现有的编译器。
GCC-XML会将C++代码编译成带有大量有用信息的XML文件;对于您的需求可能已经足够了。
不幸的是,GCC-XML只有1/4进行维护,并且让它正常工作可能有些棘手。如果您选择这条路线,祝你好运。
我们的DMS软件重构工具包可以使用强大的、功能齐全的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++解析器/名称解析/控制流分析处理完整的C++11,包括ISO、GNU和微软变体。它还会解析(并保留)包含大多数预处理条件指令的源代码。它具有驱动解析过程的显式语法,与GCC或Clang不同。