Qual è la differenza tra Flex / Lex e Yacc / Bison?


122

Qual è la differenza tra Flex & Lex e Yacc & Bison. Ho cercato selvaggiamente su Internet e non ho trovato nessuna risposta solida.

Posso installare Lex e Yacc puri su Ubuntu, oppure posso installare solo flex e bison. Sono confuso.

  • Lex o Yacc sono ancora mantenuti da qualcuno?
  • Sono tutti gratuiti?
  • Se Lex non è gratuito perché l'ho installato sulla mia distribuzione Ubuntu?

    lex --version
    lex 2.5.35
    

3
Non esiste la versione lex 2.5.35 - stai eseguendo la versione flex 2.5.35, si identifica semplicemente come 'lex' se la invochi come 'lex'
Chris Dodd

Risposte:


81

Ci sono alcune differenze tra Lex e Flex, ma devi abusare di Lex per incappare nei problemi con Flex. (Ho un programma che abusa di Lex e non funziona con Flex, quindi.) Questo è principalmente nell'area di input lookahead; in Lex, puoi fornire il tuo codice di input e modificare il flusso di caratteri; Flex non te lo lascerà fare.

Yacc e Bison sono abbastanza strettamente compatibili, anche se Bison ha alcuni trucchi extra che può fare.

Probabilmente non riesci a trovare copie legittime (l'originale, le versioni AT&T di) Lex e Yacc da installare su Ubuntu. Non direi necessariamente che è impossibile, ma non ne sono a conoscenza. Flex e Bison sono prontamente disponibili e sono equivalenti per la maggior parte degli scopi. Puoi anche trovare vari programmi alternativi e approssimativamente equivalenti dal mondo BSD.

Lex e Yacc sono gestiti dai licenziatari Unix SVRx: aziende come IBM (AIX), HP (HP-UX) e Sun (Solaris) hanno modificato le versioni di Lex e Yacc al loro comando. MKS fornisce anche MKS Lex e MKS Yacc; tuttavia, lo Yacc ha almeno alcune estensioni non standard.

Flex e Bison sono gratuiti. (AT&T) Lex e Yacc non lo sono.


4
Le informazioni su Yacc non sono corrette. Berkeley ha un Yacc, che è presente e disponibile sotto la licenza BSD su tutti i sistemi operativi BSD open source. Ho downvote su questo account, ma se la risposta viene corretta abbastanza rapidamente rimuoverò il downvote.
Daniel C. Sobral

2
@Daniel: AFAIK, AT&T Yacc non può essere ottenuto da Berkeley - quello che ottieni da Berkeley è il Berkeley Yacc. Chiarirò la risposta per riflettere questo.
Jonathan Leffler

1
In flex puoi certamente cambiare i buffer di input indolore (l'ho fatto una volta essenzialmente per gestirlo #include). Il mio libro O'Reilly su lex e yacc (non a portata di mano qui, mi dispiace) diceva che era possibile solo in lex attraverso hack disgustosi.
vonbrand

33

Bison è l'implementazione / estensione GNU di Yacc, Flex è il successore di Lex. In entrambi i casi, va bene (e consigliato) usare bison / flex.


1
Inoltre, byacc, l'implementazione Berkeley di yacc, è ampiamente disponibile (lo vedo nella mia lista di repository Debian).
Michael Ekstrand,

1
flex è chiamato così perché è (era?) molto più veloce di lex. Ha diverse estensioni, e i file generati non si somigliano affatto (cioè, i brutti hack in lex non funzionano con flex e viceversa).
vonbrand

11

Sulla maggior parte (tutti?) Dei sistemi Linux, "Lex" è in realtà un collegamento simbolico a flex. Fondamentalmente, è solo un nome diverso dalla versione gratuita.


1
Sul mio sistema (Arch Linux), i due binari non si comportano allo stesso modo. Probabilmente una funzione di compatibilità lex.
Danilo Bargen

10

YACC è disponibile con licenze open source sia da Plan 9 che da Open Solaris. Inoltre, c'è anche Berkeley YACC, che è compatibile con l'originale YACC, ma non condivide il codice sorgente. Berkeley YACC può essere trovato su qualsiasi sistema operativo BSD open source.


2

Bison in una parte del progetto GNU. E yacc è usato come utility su Berkeley Software Distribution (BSD). Sebbene sia compatibile con yacc, Lex e Yacc appartengono al passato. Flex e bison sono ampiamente usati oggi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.