2009-03-08 10 views
85

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

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

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

    lex --version 
    lex 2.5.35 
    
+2

Non esiste la versione 2.5.35 di lex - stai eseguendo la versione 2.5.35 di Flex, si identifica solo come "lex" se la invochi come "lex" –

risposta

55

Ci sono alcune differenze tra Lex e Flex, ma è necessario abusare di Lex per risolvere i problemi con Flex. (Ho un programma che abusa di Lex e non funziona in Flex, quindi.) Questo è principalmente nell'area di input lookahead; in Lex, è possibile fornire il proprio codice di input e modificare il flusso di caratteri; Flex non ti permetterà di farlo.

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

Probabilmente non è possibile trovare copie legittime di (le versioni originali di AT & 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. È inoltre possibile trovare vari programmi alternativi e approssimativamente equivalenti dal mondo BSD.

Lex e Yacc sono gestiti da Unix SVRx licencees - aziende come IBM (AIX), HP (HP-UX) e Sun (Solaris) hanno versioni modificate 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.

+3

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

+1

@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. –

+0

In flex è certamente possibile passare in modo indolore ai buffer di input (l'ho fatto una sola volta per gestire essenzialmente # # include'). Il mio libro di O'Reilly su lex & yacc (non a portata di mano qui, mi dispiace) ha detto che era possibile solo in lex attraverso hack disgustosi. – vonbrand

23

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

+1

Inoltre, byacc, l'implementazione di Berkeley di yacc, è ampiamente disponibile (lo vedo nel mio elenco di repository Debian). –

+0

flex è chiamato così perché è (era?) _molto_ più veloce di lex. Ha diverse estensioni e i file generati non sono affatto simili (ad esempio, i brutti hack in lex non funzionano con flex e viceversa). – vonbrand

8

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

+1

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

5

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