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


122

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

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

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

    lex --version
    lex 2.5.35
    

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

Answers:


81

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不在。


4
有关Yacc的信息不正确。伯克利有一个Yacc,它在所有开源BSD操作系统上均已获得BSD许可并可以使用。我对此帐户投了反对票,但如果答案得到足够迅速的纠正,我将删除该表决。
Daniel C. Sobral

2
@Daniel:AFAIK,AT&T Yacc无法从伯克利获得-从伯克利获得的是伯克利Yacc。我将澄清答案以反映这一点。
乔纳森·莱夫勒

1
在flex中,您当然可以毫不费力地切换输入缓冲区(我曾经做过一次,基本上可以处理#include)。我在O'Reilly上有关lex&yacc的书(抱歉,此处暂未提供)说,只有在lex中才能通过令人作呕的黑客行为实现。
vonbrand

33

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


1
另外,byacc是yacc的Berkeley实现,可广泛使用(我在Debian存储库列表中看到了它)。
Michael Ekstrand 2009年

1
Flex是称那是因为它是(是?)高于法快。它具有几个扩展名,并且生成的文件完全不同(例如,lex中的难看的hack无法与flex兼容,反之亦然)。
vonbrand

11

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


1
在我的系统(Arch Linux)上,两个二进制文件的行为方式不同。可能是lex兼容性功能。
Danilo Bargen

10

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


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.