Apa perbedaan antara Flex / Lex dan Yacc / Bison?

122

Apa perbedaan antara Flex & Lex dan Yacc & Bison. Saya mencari di Internet dengan liar dan saya tidak menemukan jawaban yang pasti.

Dapatkah saya menginstal Lex dan Yacc murni di Ubuntu, atau saya hanya dapat menginstal flex dan bison. Saya bingung.

  • Apakah Lex atau Yacc masih dipelihara oleh seseorang?
  • Apakah semuanya gratis?
  • Jika Lex tidak gratis, mengapa saya menginstalnya di distribusi Ubuntu saya?

    lex --version
    lex 2.5.35
    
Penanya bodoh
sumber
3
Tidak ada lex versi 2.5.35 - Anda menjalankan versi fleksibel 2.5.35, itu hanya mengidentifikasi dirinya sebagai 'lex' jika Anda memanggilnya sebagai 'lex'
Chris Dodd

Jawaban:

81

Ada beberapa perbedaan antara Lex dan Flex, tetapi Anda harus menyalahgunakan Lex untuk mengalami masalah dengan Flex. (Saya memiliki program yang menyalahgunakan Lex dan tidak bekerja di bawah Flex, oleh karena itu.) Ini terutama di bidang input lookahead; di Lex, Anda dapat memberikan kode input Anda sendiri dan mengubah aliran karakter; Flex tidak akan membiarkan Anda melakukan itu.

Yacc dan Bison sangat cocok, meskipun Bison memiliki beberapa trik tambahan yang dapat dilakukan.

Anda mungkin tidak dapat menemukan salinan resmi Lex dan Yacc (asli, versi AT&T) untuk diinstal di Ubuntu. Saya tidak selalu mengatakan itu tidak mungkin, tetapi saya tidak menyadarinya. Flex dan Bison sudah tersedia dan setara untuk sebagian besar tujuan. Anda juga dapat menemukan berbagai alternatif dan program yang kurang lebih setara dari dunia BSD.

Lex dan Yacc dikelola oleh lisensi Unix SVRx - perusahaan seperti IBM (AIX), HP (HP-UX) dan Sun (Solaris) telah memodifikasi versi Lex dan Yacc atas perintah mereka. MKS juga menyediakan MKS Lex dan MKS Yacc; namun, Yacc setidaknya memiliki beberapa ekstensi non-standar.

Flex dan Bison gratis. (AT&T) Lex dan Yacc tidak.

Jonathan Leffler
sumber
4
Informasi tentang Yacc salah. Berkeley memiliki Yacc, yang ada dan tersedia di bawah lisensi BSD pada semua sistem operasi BSD open source. Saya memberikan suara negatif pada akun ini, tetapi jika jawabannya diperbaiki dengan cukup cepat, saya akan menghapus suara negatif tersebut.
Daniel C. Sobral
2
@Daniel: AFAIK, AT&T Yacc tidak dapat diperoleh dari Berkeley - apa yang Anda dapatkan dari Berkeley adalah Berkeley Yacc. Saya akan menjelaskan jawaban untuk mencerminkan itu.
Jonathan Leffler
1
Dalam fleksibel Anda pasti dapat mengganti buffer input tanpa rasa sakit (saya melakukannya sekali untuk menangani dasarnya #include). Buku O'Reilly saya tentang lex & yacc (tidak ada di sini, maaf) mengatakan bahwa itu hanya mungkin dalam lex melalui peretasan yang menjijikkan.
vonbrand
33

Bison adalah implementasi / ekstensi GNU dari Yacc, Flex adalah penerus Lex. Dalam kedua kasus tersebut, tidak masalah (dan disarankan) untuk menggunakan bison / flex.

Jan Jungnickel
sumber
1
Selain itu, byacc, implementasi Berkeley dari yacc, tersedia secara luas (saya melihatnya di daftar repositori Debian saya).
Michael Ekstrand
1
flex disebut demikian karena (was?) jauh lebih cepat daripada lex. Ia memiliki beberapa ekstensi, dan file yang dihasilkan sama sekali tidak mirip (yaitu, hacks jelek di lex tidak bekerja dengan flex dan sebaliknya).
vonbrand
11

Pada kebanyakan (semua?) Sistem Linux, "Lex" sebenarnya adalah tautan simbolis untuk melenturkan. Pada dasarnya, ini hanya nama yang berbeda dengan versi gratisnya.

ndr
sumber
1
Di sistem saya (Arch Linux), kedua biner tidak berperilaku sama. Mungkin fitur kompatibilitas lex.
Danilo Bargen
10

YACC tersedia di bawah lisensi open source dari Plan 9 dan Open Solaris. Selain itu, ada juga Berkeley YACC, yang kompatibel dengan YACC asli, tetapi tidak berbagi kode sumber. Berkeley YACC dapat ditemukan di semua sistem operasi open source BSD.

Daniel C. Sobral
sumber
2

Bison di bagian dari proyek GNU. Dan yacc digunakan sebagai utilitas di Berkeley Software Distribution (BSD). Meskipun kompatibel dengan yacc, Lex dan Yacc sudah ketinggalan zaman. Flex dan bison banyak digunakan saat ini.

Avani Ranade
sumber