Quelle est la différence entre Flex / Lex et Yacc / Bison?


122

Quelle est la différence entre Flex & Lex et Yacc & Bison. J'ai fouillé Internet de manière extravagante et je n'ai trouvé aucune réponse solide.

Puis-je installer pure Lex et Yacc sur Ubuntu, ou je ne peux installer que flex et bison. Je suis confus.

  • Est-ce que Lex ou Yacc sont toujours entretenus par quelqu'un?
  • Sont-ils tous gratuits?
  • Si Lex n'est pas gratuit, pourquoi l'ai-je installé sur ma distribution Ubuntu?

    lex --version
    lex 2.5.35
    

3
Il n'y a pas de version 2.5.35 de lex - vous exécutez la version 2.5.35 de flex, il s'identifie simplement comme 'lex' si vous l'invoquez comme 'lex'
Chris Dodd

Réponses:


81

Il y a quelques différences entre Lex et Flex, mais vous devez abuser de Lex pour rencontrer les problèmes avec Flex. (J'ai un programme qui abuse de Lex et ne fonctionne donc pas sous Flex.) C'est principalement dans le domaine de la recherche d'entrée; dans Lex, vous pouvez fournir votre propre code d'entrée et modifier le flux de caractères; Flex ne vous laissera pas faire cela.

Yacc et Bison sont assez étroitement compatibles, bien que Bison ait quelques astuces supplémentaires qu'il peut faire.

Vous ne pouvez probablement pas trouver de copies légitimes de (les versions originales, AT&T de) Lex et Yacc à installer sur Ubuntu. Je ne dirais pas nécessairement que c'est impossible, mais je n'en suis pas au courant. Flex et Bison sont facilement disponibles et sont équivalents dans la plupart des cas. Vous pouvez également trouver divers programmes alternatifs et à peu près équivalents du monde BSD.

Lex et Yacc sont maintenus par les licenciés Unix SVRx - des sociétés comme IBM (AIX), HP (HP-UX) et Sun (Solaris) ont des versions modifiées de Lex et Yacc à leur commande. MKS fournit également MKS Lex et MKS Yacc; cependant, le Yacc a au moins quelques extensions non standard.

Flex et Bison sont gratuits. (AT&T) Lex et Yacc ne le sont pas.


4
Les informations sur Yacc sont incorrectes. Berkeley a un Yacc, qui est présent et disponible sous licence BSD sur tous les systèmes d'exploitation BSD open source. J'ai voté contre ce compte, mais si la réponse est corrigée assez rapidement, je supprimerai le vote défavorable.
Daniel C.Sobral

2
@Daniel: AFAIK, AT&T Yacc ne peuvent pas être obtenus de Berkeley - ce que vous obtenez de Berkeley est le Berkeley Yacc. Je vais clarifier la réponse pour refléter cela.
Jonathan Leffler

1
En flex, vous pouvez certainement changer de tampon d'entrée sans douleur (je l'ai fait une fois pour gérer essentiellement #include). Mon livre O'Reilly sur lex & yacc (pas à portée de main ici, désolé) dit que ce n'était possible dans lex que par des hacks dégoûtants.
vonbrand

33

Bison est l'implémentation / extension GNU de Yacc, Flex est le successeur de Lex. Dans les deux cas, il est bon (et recommandé) d'utiliser bison / flex.


1
De plus, byacc, l'implémentation Berkeley de yacc, est largement disponible (je le vois dans ma liste de référentiels Debian).
Michael Ekstrand

1
flex s'appelle ainsi parce qu'il est (était?) beaucoup plus rapide que lex. Il a plusieurs extensions, et les fichiers générés ne sont pas du tout similaires (c'est-à-dire que les hacks laids dans lex ne fonctionnent pas avec flex et vice versa).
vonbrand

11

Sur la plupart des systèmes Linux (tous?), "Lex" est en fait un lien symbolique vers flex. En gros, ce n'est qu'un nom différent de la version gratuite.


1
Sur mon système (Arch Linux), les deux binaires ne se comportent pas de la même manière. Probablement une fonctionnalité de compatibilité lex.
Danilo Bargen

10

YACC est disponible sous les licences open source de Plan 9 et Open Solaris. En outre, il existe également Berkeley YACC, qui est compatible avec le YACC d'origine, mais ne partage pas le code source. Berkeley YACC peut être trouvé sur l'un des systèmes d'exploitation BSD open source.


2

Bison dans une partie du projet GNU. Et yacc est utilisé comme un utilitaire sur Berkeley Software Distribution (BSD). Bien qu'il soit compatible avec yacc, mais Lex et Yacc appartiennent au passé. Le flex et le bison sont largement utilisés aujourd'hui.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.