Flex/Lex和Yacc/Bison有什么区别?

141
什么是Flex和Lex以及Yacc和Bison的区别?我搜索了互联网,但没有找到任何确定的答案。
我能在Ubuntu上安装纯Lex和Yacc吗,还是只能安装flex和bison?我很困惑。
- Lex或Yacc是否仍由某人维护? - 它们都是免费的吗? - 如果Lex不是免费的,为什么我在我的Ubuntu发行版中安装了它?
lex --version
lex 2.5.35

4
没有 Lex 版本 2.5.35 -- 您正在运行 Flex 版本 2.5.35,只是在将其作为“Lex”调用时标识自己为“Lex”。 - Chris Dodd
5个回答

97
Lex和Flex之间存在一些差异,但您必须滥用Lex才会遇到使用Flex的问题。(因此,我有一个滥用Lex并在Flex下无法工作的程序。)这主要涉及输入前瞻方面;在Lex中,您可以提供自己的输入代码并修改字符流;Flex不允许您这样做。
Yacc和Bison非常兼容,尽管Bison有一些额外的技巧可用。
您可能找不到(原始的AT&T版本的)Lex和Yacc的合法副本以安装在Ubuntu上。我不一定会说这是不可能的,但我不知道这样的情况。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则不是。

5
有关 Yacc 的信息是不正确的。伯克利有一个名为 Yacc 的工具,在所有开源 BSD 操作系统下都以 BSD 许可证的形式存在并可用。我在这个账户上投了反对票,但如果回答被迅速更正,我会取消这个反对票。 - Daniel C. Sobral
3
据我所知,AT&T Yacc无法从伯克利获取 - 你从伯克利获得的是伯克利Yacc。我会澄清回答以反映这一点。 - Jonathan Leffler
1
在Flex中,您肯定可以轻松切换输入缓冲区(我曾经这样做来处理基本上的#include)。我的O'Reilly关于lex和yacc的书(抱歉,手头没有)说,在lex中只能通过令人讨厌的黑客攻击来实现。 - vonbrand

39

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


1
此外,byacc(yacc 的伯克利实现版本)也是广为可得的(我在我的 Debian 软件库列表中看到了它)。 - Michael Ekstrand
1
Flex之所以被称为Flex,是因为它比Lex快得多。它有几个扩展,并且生成的文件看起来完全不相似(即,在Lex中的丑陋黑客无法在Flex中使用,反之亦然)。 - vonbrand
是,而不是过去式。没有人曾经修复过 *lex(1)*。@vonbrand。 - user207421

12

在大多数(或全部?)Linux系统中,“Lex”实际上是指向flex的符号链接。基本上,它只是自由版本的不同名称。


1
在我的系统上(Arch Linux),这两个二进制文件的行为不同。可能是一个词法兼容性特性。 - Danilo Bargen

11

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


3

Bison是GNU项目的一部分。而yacc作为伯克利软件发行版(BSD)上的实用程序使用。虽然它兼容yacc,但Lex和Yacc已经过时了。如今广泛使用Flex和bison。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接