题
我正在尝试使用一种代码生成器来帮助对传统的C / C ++混合项目进行单元测试。我没有发现任何一种独立的工具可以从声明中生成存根代码。所以我决定建立一个,它应该不那么难。
拜托,任何人都可以给我一个标准的语法链接,更好地用yacc语言描述。
希望我不是重新发明轮子,请在这种情况下帮助我。
最诚挚的问候, 凯文
解决方案
来自 C ++ FAQ Lite :
你想要的主要yacc语法 来自Ed Willink。艾德相信他的 语法完全符合 然而,他是ISO / ANSI C ++标准 不保证:“语法有 不是,"他说,“已经被愤怒地使用了。” 你可以获得没有语法 动作例程或语法 使用虚拟动作例程。您 也可以相应的 词法。对于那些人 对他如何实现一个感兴趣 无上下文解析器(通过推送所有 含糊不清加少数 解析后稍后进行修复 完成),你可能想读 他的论文的第4章。
还有一个非常古老的yacc语法 不支持模板, 异常,也不是命名空间;加上它 偏离核心语言 一些微妙的方式。你可以得到它 语法此处或这里。
其他提示
我最近发现了一些C ++的语法文件(C ++ 1998: ISO / IEC 14882:1998 和C ++ 2008: ISO / IEC SC22 / WG21 N2723 = 08-0233 )在语法软件网站。语法以 Enahnced BNF,DMS BNF,BGF,SDF和Rascal 表示法表示。遗憾的是,C ++语法似乎没有得到更新(没有C ++ 2003或C ++ 11)。
Jared的链接是你可以获得的无上下文语法最接近的东西。某些事情确实需要延迟以供日后使用,但这比一些参数更好于C ++的上下文敏感语法。
更糟糕的是,C ++ 1x会显着地复杂化语法。为了获得完美的C ++解析,解析器需要实现足够的标准来正确地执行重载解析,包括模板参数推导,这反过来将需要概念机制,lambdas,实际上几乎所有的语言,除了两阶段名称查找和异常规范,如果我没记错的话,不需要实际的实现来成功解析程序。
实际上,如果可以解析C ++,那么你就是编译器的一半。
对于另一种方法,您可以考虑在现有编译器上进行背负。
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和Microsoft变体中。它还将解析(并保留) 包含大多数预处理器条件的源代码。它有一个明确的语法 与GCC或Clang不同,推动解析过程。