【问题标题】:What is the difference between Flex/Lex and Yacc/Bison?Flex/Lex 和 Yacc/Bison 有什么区别?
【发布时间】:2010-10-12 00:44:33
【问题描述】:

Flex & Lex 和 Yacc & Bison 有什么区别。我在互联网上疯狂搜索,但没有找到任何可靠的答案。

我可以在 Ubuntu 上安装纯 Lex 和 Yacc,还是只能安装 flex 和 bison。我很困惑。

  • Lex 或 Yacc 是否仍由某人维护?
  • 都是免费的吗?
  • 如果 Lex 不是免费的,为什么要在我的 Ubuntu 发行版上安装它?

    lex --version
    lex 2.5.35
    

【问题讨论】:

  • 没有 lex 版本 2.5.35 -- 您正在运行 flex 版本 2.5.35,如果您将其调用为“lex”,它只会将自己标识为“lex”

标签: parsing bison yacc flex-lexer lex


【解决方案1】:

Bison 是 GNU 项目的一部分。 yacc 被用作 Berkeley Software Distribution (BSD) 上的实用程序。虽然它与 yacc 兼容,但 Lex 和 Yacc 已成为过去。 Flex 和 bison 如今已被广泛使用。

【讨论】:

    【解决方案2】:

    Lex 和 Flex 之间存在一些差异,但您必须滥用 Lex 才能遇到 Flex 的问题。 (我有一个滥用 Lex 的程序,因此不能在 Flex 下运行。)这主要是在输入前瞻领域;在 Lex 中,您可以提供自己的输入代码并修改字符流; Flex 不会让你这样做。

    Yacc 和 Bison 非常兼容,尽管 Bison 有一些额外的技巧可以做。

    您可能无法在 Ubuntu 上安装 Lex 和 Yacc 的(原始的、AT&T 版本的)合法副本。我不一定会说这是不可能的,但我不知道这一点。 Flex 和 Bison 很容易获得,并且对于大多数用途来说是等效的。您还可以从 BSD 世界中找到各种替代的和大致等效的程序。

    Lex 和 Yacc 由 Unix SVRx 许可证持有者维护 - IBM (AIX)、HP (HP-UX) 和 Sun (Solaris) 等公司根据他们的命令修改了 Lex 和 Yacc 版本。 MKS 还提供 MKS Lex 和 MKS Yacc;但是,Yacc 至少有一些非标准的扩展。

    Flex 和 Bison 是免费的。 (AT&T) Lex 和 Yacc 不是。

    【讨论】:

    • Yacc信息不正确。 Berkeley 有一个 Yacc,它在所有开源 BSD 操作系统上都存在并在 BSD 许可下可用。我对此帐户投了反对票,但如果答案得到及时纠正,我将删除反对票。
    • @Daniel:AFAIK,无法从伯克利获得 AT&T Yacc - 你从伯克利获得的是伯克利 Yacc。我会澄清答案以反映这一点。
    • 在 flex 中,您当然可以轻松地切换输入缓冲区(我曾经做过一次,基本上是为了处理 #include)。我的 O'Reilly 关于 lex 和 yacc 的书(这里没有,抱歉)说只有通过令人作呕的 hack 在 lex 中才有可能。
    【解决方案3】:

    YACC 在 Plan 9 和 Open Solaris 的开源许可下可用。另外,还有 Berkeley YACC,它与原 YACC 兼容,但不共享源代码。 Berkeley YACC 可以在任何开源 BSD 操作系统上找到。

    【讨论】:

      【解决方案4】:

      在大多数(所有?)Linux 系统上,“Lex”实际上是 flex 的符号链接。基本上,它只是免费版的不同名称。

      【讨论】:

      • 在我的系统(Arch Linux)上,这两个二进制文件的行为方式不同。可能是 lex 兼容性功能。
      【解决方案5】:

      Bison 是 Yacc 的 GNU 实现/扩展,Flex 是 Lex 的继承者。无论哪种情况,都可以(并且推荐)使用 bison / flex。

      【讨论】:

      • 此外,yacc 的伯克利实现 byacc 已广泛可用(我在我的 Debian 存储库列表中看到它)。
      • flex 之所以这么叫,是因为它(曾经?)比 lex 快得多。它有几个扩展名,生成的文件完全不相似(即 lex 中丑陋的 hack 不适用于 flex,反之亦然)。
      • 是,不是。没有人修复过 lex(1)。 @vonbrand。
      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多