【问题标题】:C++ create a parser [closed]C ++创建解析器[关闭]
【发布时间】:2009-12-03 22:37:15
【问题描述】:

在 C++ 中从具有语法的文件创建解析器的最佳方法是什么?

【问题讨论】:

标签: c++ parsing grammar


【解决方案1】:

您可能还想看看这些链接:

【讨论】:

  • 我同意这一点。 Boost 文档真的很有帮助。
  • 我建议不要使用boost::spirit,如果您计划使用任何合适大小的编译器 - 使用boost::spirit 构建的解析器的编译时间往往会变得非常大,即使是非常小的更改也会成为 PITA (因为整个事情都是用模板完成的)
【解决方案2】:

这在很大程度上取决于语法。我倾向于喜欢递归下降解析器,它们通常是手工编写的(尽管可以从语法描述中生成一个)。

如果您要使用解析器生成器,确实有两个不错的选择:Byacc 和 Antlr。如果您想要与 yacc (合理)兼容的东西,那么 Byacc 是(到目前为止)您的最佳选择。如果您是从头开始,既没有现有代码,也没有经验支持使用与 yacc 兼容的东西,那么 Antlr 几乎肯定是您的最佳选择。

既然提到了,我还要谈谈 Bison。我会像瘟疫一样避免野牛。布鲁克斯关于“计划扔掉一个”的建议在这里适用。 Robert Corbett(Byacc 的作者)写了 Bison 作为他对解析器生成器的第一次尝试。不幸的是,他没有把它扔掉,而是把它交给了 GNU。在营销击败技术卓越的经典案例中,Bison 被广泛使用(甚至被那些不了解的人推荐),而 Byacc 仍然相对模糊。

编辑:我讨厌这样做,但由于它也被提及,我也会评论 Boost.spirit。虽然这可能是最酷的模板元编程示例,但它有几个问题导致我建议不要尝试将其投入使用。

  1. 使用它的编译时间会让人难以忍受——10 分钟很常见,而更大/更复杂的语法可能需要更长的时间(假设它不会使编译器崩溃)。
  2. 如果您犯了任何错误,它可能并且经常会产生几乎不可能破译的非常长的错误消息。来自大量模板代码的错误消息是出了名的糟糕,Spirit 对系统的压力几乎超过了其他任何事情。

相信我:你可以写出像 Spirit 这样的东西,这完全是在令人印象深刻和令人惊叹之间的边界上——但我仍然只会在我确定我正在处理的语法是(并且会永远保持)相当小而简单。

【讨论】:

    【解决方案3】:

    flexbison。 Lex 和 Yacc 表兄弟确实考虑了 c++ 的存在。

    【讨论】:

      【解决方案4】:

      你看过Lex and Yacc 吗?引用链接文档的第 5 节:

      制作 C++ 解析器的首选方式 是让 Lex 生成一个普通的 C 文件,并让 YACC 生成 C++ 代码。当你然后链接你的 应用程序,你可能会遇到一些 问题是因为 C++ 代码由 默认找不到C 功能,除非你告诉它 这些函数是外部“C”。

      【讨论】:

      • Lex 和 Yacc 已被 Flex 和 Bison 取代。
      【解决方案5】:

      我用过bison,找到了适合我水平的例子。能够用它创建一个简单的计算器,当然它可以做得更多。

      计算器以1+2*3为例,构建语法树。但是文档没有描述如何构建树,这花了我一点时间来解决。

      如果我再去一次,我会研究 'antlr',因为它看起来不错并且得到很好的支持。

      马丁。

      【讨论】:

        【解决方案6】:

        创建解析器的最佳方式是使用 lex 和 yacc。

        【讨论】:

        • 没有人能回答关于 best 的问题,但你已经非常接近了 - lex&yacc 表兄弟 flex&bison 确实考虑了 c++。
        • 我假设问题是关于如何用 C++ 手动编写解析器。
        猜你喜欢
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多