Jaka jest różnica między Flex / Lex a Yacc / Bison?

122

Jaka jest różnica między Flex & Lex a Yacc & Bison. Szukałem dziko w Internecie i nie znalazłem żadnej solidnej odpowiedzi.

Czy mogę zainstalować czysty Lex i Yacc na Ubuntu, czy mogę zainstalować tylko flex i bison. Jestem zdezorientowany.

  • Czy Lex lub Yacc nadal są przez kogoś utrzymywane?
  • Czy wszystkie są bezpłatne?
  • Jeśli Lex nie jest wolny, dlaczego mam go zainstalować w mojej dystrybucji Ubuntu?

    lex --version
    lex 2.5.35
    
Głupi Pytający
źródło
3
Nie ma wersji lex 2.5.35 - używasz wersji Flex 2.5.35, po prostu identyfikuje się jako `` lex '', jeśli wywołasz go jako `` lex ''
Chris Dodd

Odpowiedzi:

81

Istnieją pewne różnice między Lex i Flex, ale musisz nadużywać Lexa, aby napotkać problemy z Flex. (Mam program, który nadużywa Lexa i dlatego nie działa pod Flex.) Jest to głównie w obszarze wyszukiwania danych wejściowych; w Leksie możesz podać swój własny kod wejściowy i zmodyfikować strumień znaków; Flex Ci na to nie pozwoli.

Yacc i Bison są dość blisko kompatybilne, chociaż Bison ma kilka dodatkowych sztuczek, które może zrobić.

Prawdopodobnie nie możesz znaleźć legalnych kopii (oryginalnych wersji AT&T) Lexa i Yacc do zainstalowania na Ubuntu. Niekoniecznie powiedziałbym, że jest to niemożliwe, ale nie jestem tego świadomy. Flex i Bison są łatwo dostępne i są równoważne w większości zastosowań. Możesz także znaleźć różne alternatywne i w przybliżeniu równoważne programy ze świata BSD.

Lex i Yacc są utrzymywane przez licencjobiorców Unix SVRx - firmy takie jak IBM (AIX), HP (HP-UX) i Sun (Solaris) mają zmodyfikowane wersje Lex i Yacc na swoje polecenie. MKS dostarcza również MKS Lex i MKS Yacc; jednakże Yacc ma przynajmniej kilka niestandardowych rozszerzeń.

Flex i Bison są bezpłatne. (AT&T) Lex i Yacc nie są.

Jonathan Leffler
źródło
4
Informacje o Yacc są nieprawidłowe. Berkeley ma Yacc, który jest obecny i dostępny na licencji BSD we wszystkich systemach operacyjnych BSD typu open source. Głosowałem w dół na tym koncie, ale jeśli odpowiedź zostanie poprawiona wystarczająco szybko, wycofam głos przeciw.
Daniel C. Sobral
2
@Daniel: AFAIK, AT&T Yacc nie można uzyskać od Berkeley - to, co otrzymujesz od Berkeley, to Berkeley Yacc. Wyjaśnię odpowiedź, aby to odzwierciedlić.
Jonathan Leffler
1
We fleksie z pewnością można bezboleśnie przełączać bufory wejściowe (zrobiłem to raz, aby obsłużyć zasadniczo #include). W mojej książce O'Reilly na temat lex & yacc (niestety nie ma jej tutaj pod ręką), napisałem, że jest to możliwe tylko w lexie poprzez obrzydliwe hacki.
vonbrand
33

Bison jest implementacją / rozszerzeniem GNU Yacc, Flex jest następcą Lexa. W obu przypadkach dobrze (i zalecane) jest użycie bison / flex.

Jan Jungnickel
źródło
1
Dodatkowo byacc, implementacja yacc z Berkeley, jest szeroko dostępna (widzę ją na mojej liście repozytoriów Debiana).
Michael Ekstrand
1
flex jest tak nazywany, ponieważ jest (był?) znacznie szybszy niż lex. Ma kilka rozszerzeń, a wygenerowane pliki nie są w ogóle podobne (tj. Brzydkie hacki w lexie nie działają z flexem i odwrotnie).
vonbrand
11

W większości (wszystkich?) Systemów Linux, „Lex” jest w rzeczywistości symbolicznym dowiązaniem do flex. Zasadniczo jest to tylko inna nazwa niż wersja bezpłatna.

ndr
źródło
1
W moim systemie (Arch Linux) dwa pliki binarne nie zachowują się w ten sam sposób. Prawdopodobnie funkcja zgodności lex.
Danilo Bargen
10

YACC jest dostępny na licencjach open source zarówno z Planu 9, jak i Open Solaris. Istnieje również Berkeley YACC, który jest kompatybilny z oryginalnym YACC, ale nie udostępnia kodu źródłowego. Berkeley YACC można znaleźć w dowolnym systemie operacyjnym BSD typu open source.

Daniel C. Sobral
źródło
2

Bison w części projektu GNU. Yacc jest używany jako narzędzie w Berkeley Software Distribution (BSD). Chociaż jest kompatybilny z yacc, to Lex i Yacc należą już do przeszłości. Flex i bison są dziś szeroko stosowane.

Avani Ranade
źródło