【问题标题】:c++ what is the advantage of lex and bison to a selfmade tokenizer / parserc ++ lex和bison对自制标记器/解析器有什么好处
【发布时间】:2010-07-13 14:48:27
【问题描述】:

出于学习目的,我想在 C++ 中进行一些解析和标记化。现在我在网上阅读这个主题时经常会遇到 bison/yacc 和 lex。 使用那些比使用 STL 或 boost::regex 或什至可能只是 C 编写的标记器/解析器有什么好处吗?

【问题讨论】:

    标签: c++ parsing bison tokenize


    【解决方案1】:

    我最近着手编写一个简单的词法分析器和解析器。

    事实证明,词法分析器更容易手动编码。但是解析器有点困难。我的 Bison 生成的解析器几乎可以立即工作,它给了我很多有用的信息,告诉我我在哪里忘记了状态。后来我手动编写了相同的解析器,但在我让它完美运行之前需要更多的调试。

    为词法分析器和解析器生成工具的吸引力在于,您可以用一种简洁易读的语言编写规范,该语言接近于您的规范的最短可能再现。一个手写的解析器通常至少是两倍大。此外,自动解析器 (/lexer) 附带大量诊断代码和逻辑,可帮助您调试事物。

    如果您的语言或需求发生变化,类似 BNF 语言的解析器/词法分析器规范也更容易更改。如果您正在处理手写的解析器/词法分析器,您可能需要深入挖掘您的代码并进行重大更改。

    最后,因为它们通常被实现为没有回溯的有限状态机(Bison 上有数以万计的选项,所以这并不总是给定的),你的自动生成的代码很可能会比你手动生成的代码更高效——编码产品。

    【讨论】:

    • 感谢您的详细回答,我想我会尝试两个只是为了比较,因为它只是为了好玩!
    【解决方案2】:

    其他人已经为您编写并调试了它们?

    【讨论】:

      【解决方案3】:

      它更容易,而且更通用。 Bison/Lex 可以对任意语法进行分词和解析,并以更简单的格式呈现。它们也可能更快,具体取决于您编写正则表达式的程度。

      我不想用 C 编写自己的解析器,因为该语言对字符串没有很好的直觉。如果您自己编写,我会推荐 perl 以简化正则表达式(或可能是 python)。

      使用现有工具可能会更快,但它可能会也可能不会那么有趣。如果你有时间,因为它只是为了学习,那就去吧。 C++ 是一门很好的入门语言。

      【讨论】:

      • 他们当然无法解析“任意语法”。
      【解决方案4】:

      不同人的不同笔画。我个人喜欢递归下降解析器 - 我发现它们很容易理解,并且您可以使它们产生比野牛等工具产生的更出色的最终用户错误消息。

      【讨论】:

      • 我还发现,在解析和词法分析重叠的某些语言中,面对棘手的边缘情况,它们往往更加健壮。
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多