我正在尝试使用一种代码生成器来帮助对传统的C / C ++混合项目进行单元测试。我没有发现任何一种独立的工具可以从声明中生成存根代码。所以我决定建立一个,它应该不那么难。
拜托,任何人都可以给我一个标准的语法链接,更好地用yacc语言描述。
希望我不是重新发明轮子,请在这种情况下帮助我。
最诚挚的问候, 凯文
答案 0 :(得分:24)
来自C++ FAQ Lite:
38.11 Is there a yacc-able C++ grammar?
你想要的主要yacc语法 来自Ed Willink。艾德相信他的 语法完全符合the ISO/ANSI C++ standard,但是他 不保证:“语法有 不是,“他说,”愤怒地使用了。“ 您可以获得the grammar without action routines或the grammar with dummy action routines。您 也可以获得the corresponding lexer。对于那些人 对他如何实现一个感兴趣 无上下文解析器(通过推送所有 含糊不清加少数 解析后稍后进行修复 完成),你可能想读 his thesis的第4章。
还有一个非常古老的yacc语法 不支持模板, 异常,也不是命名空间;加上它 偏离核心语言 一些微妙的方式。你可以得到它 语法here或here。
答案 1 :(得分:4)
我最近发现了一些C ++的语法文件(C ++ 1998: ISO / IEC 14882:1998 和C ++ 2008: ISO / IEC SC22 / WG21 N2723 = 08-0233 强大的>)grammarware website。语法以 Enahnced BNF,DMS BNF,BGF,SDF和Rascal 表示法表示。遗憾的是,C ++语法似乎没有得到更新(没有C ++ 2003或C ++ 11)。
答案 2 :(得分:2)
我最近找到了this one。我没试过,所以不确定它是否有效。您能否提供有关您正在尝试开发的工具的更多信息?我下载了这个语法,因为我正在使用一个检测工具,所以我可以为我的unit test framework添加覆盖信息。
重新阅读评论后......
我认为this tool完全符合您的需求。
答案 3 :(得分:2)
Jared的链接是你可以获得的无上下文语法最接近的东西。某些事情确实需要延迟以供日后使用,但这比一些参数更好于C ++的上下文敏感语法。
更糟糕的是,C ++ 1x会显着地复杂化语法。为了获得完美的C ++解析,解析器需要实现足够的标准来正确地执行重载解析,包括模板参数推导,这反过来将需要概念机制,lambdas,实际上几乎所有的语言,除了两阶段名称查找和异常规范,如果我没记错的话,不需要实际的实现来成功解析程序。
实际上,如果可以解析C ++,那么你就是编译器的一半。
答案 4 :(得分:2)
答案 5 :(得分:1)
我们的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不同,推动解析过程。