在哪里可以找到C ++语言的标准BNF或YACC语法?

时间:2009-03-05 03:24:22

标签: c++ yacc bnf

我正在尝试使用一种代码生成器来帮助对传统的C / C ++混合项目进行单元测试。我没有发现任何一种独立的工具可以从声明中生成存根代码。所以我决定建立一个,它应该不那么难。

拜托,任何人都可以给我一个标准的语法链接,更好地用yacc语言描述。

希望我不是重新发明轮子,请在这种情况下帮助我。

最诚挚的问候, 凯文

6 个答案:

答案 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 routinesthe grammar with dummy action routines。您   也可以获得the corresponding lexer。对于那些人   对他如何实现一个感兴趣   无上下文解析器(通过推送所有   含糊不清加少数   解析后稍后进行修复   完成),你可能想读   his thesis的第4章。

     

还有一个非常古老的yacc语法   不支持模板,   异常,也不是命名空间;加上它   偏离核心语言   一些微妙的方式。你可以得到它   语法herehere

答案 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不同,推动解析过程。