Sự khác biệt giữa Flex / Lex và Yacc / Bison là gì?


122

Sự khác biệt giữa Flex & Lex và Yacc & Bison. Tôi đã tìm kiếm trên Internet một cách điên cuồng và tôi không tìm thấy bất kỳ câu trả lời chắc chắn nào.

Tôi có thể cài đặt Lex và Yacc thuần túy trên Ubuntu không, hay tôi chỉ có thể cài đặt flex và bison. Tôi bị bối rối.

  • Lex hay Yacc vẫn được ai đó duy trì?
  • Tất cả chúng đều miễn phí?
  • Nếu Lex không miễn phí tại sao tôi lại cài đặt nó trên bản phân phối Ubuntu của mình?

    lex --version
    lex 2.5.35
    

3
Không có phiên bản lex 2.5.35 - bạn đang chạy flex phiên bản 2.5.35, nó chỉ xác định chính nó như là 'lex' nếu bạn gọi nó là 'lex'
Chris Dodd

Câu trả lời:


81

Có một số khác biệt giữa Lex và Flex, nhưng bạn phải lạm dụng Lex để gặp phải các vấn đề với Flex. (Do đó, tôi có một chương trình lạm dụng Lex và không hoạt động dưới Flex.) Điều này chủ yếu nằm trong lĩnh vực đầu vào của lookahead; trong Lex, bạn có thể cung cấp mã đầu vào của riêng mình và sửa đổi luồng ký tự; Flex sẽ không cho phép bạn làm điều đó.

Yacc và Bison khá tương thích với nhau, mặc dù Bison có một số thủ thuật bổ sung mà nó có thể làm.

Bạn có thể không tìm thấy các bản sao hợp pháp của (phiên bản gốc, AT&T của) Lex và Yacc để cài đặt trên Ubuntu. Tôi không nhất thiết phải nói điều đó là không thể, nhưng tôi không biết về điều đó. Flex và Bison luôn có sẵn và tương đương với hầu hết các mục đích. Bạn cũng có thể tìm thấy nhiều chương trình thay thế và tương đương khác nhau từ thế giới BSD.

Lex và Yacc được duy trì bởi các công ty Unix SVRx - các công ty như IBM (AIX), HP (HP-UX) và Sun (Solaris) đã sửa đổi các phiên bản của Lex và Yacc theo lệnh của họ. MKS cũng cung cấp MKS Lex và MKS Yacc; tuy nhiên, Yacc ít nhất có một số phần mở rộng không chuẩn.

Flex và Bison miễn phí. (AT&T) Lex và Yacc thì không.


4
Thông tin về Yacc không chính xác. Berkeley có Yacc, hiện có và có sẵn theo giấy phép BSD trên tất cả các hệ điều hành BSD mã nguồn mở. Tôi đã phản đối tài khoản này, nhưng nếu câu trả lời được sửa đủ nhanh, tôi sẽ xóa phiếu phản đối.
Daniel C. Sobral, 27/07/09

2
@Daniel: AFAIK, AT&T Yacc không thể lấy được từ Berkeley - thứ bạn nhận được từ Berkeley là Berkeley Yacc. Tôi sẽ làm rõ câu trả lời để phản ánh điều đó.
Jonathan Leffler

1
Trong flex, bạn chắc chắn có thể chuyển đổi bộ đệm đầu vào một cách dễ dàng (tôi đã làm điều đó một lần để xử lý về cơ bản #include). Cuốn sách O'Reilly của tôi về lex & yacc (không có ở đây, xin lỗi) nói rằng điều đó chỉ có thể xảy ra với lex thông qua các vụ hack kinh tởm.
vonbrand

33

Bison là triển khai / mở rộng GNU của Yacc, Flex là người kế nhiệm của Lex. Trong cả hai trường hợp, bạn nên sử dụng bison / flex.


1
Ngoài ra, byacc, cách triển khai Berkeley của yacc, có sẵn rộng rãi (tôi thấy nó trong danh sách kho lưu trữ Debian của mình).
Michael Ekstrand

1
flex được gọi như vậy vì nó là (là?) nhiều nhanh hơn lex. Nó có một số phần mở rộng và các tệp được tạo không giống nhau chút nào (tức là, các bản hack xấu xí trong lex không hoạt động với flex và viceversa).
vonbrand

11

Trên hầu hết (tất cả?) Hệ thống Linux, "Lex" thực sự là một liên kết tượng trưng để flex. Về cơ bản, nó chỉ là một cái tên khác với phiên bản miễn phí.


1
Trên hệ thống của tôi (Arch Linux), hai tệp nhị phân không hoạt động giống nhau. Có lẽ là một tính năng tương thích lex.
Danilo Bargen

10

YACC có sẵn theo giấy phép nguồn mở từ cả Plan 9 và Open Solaris. Ngoài ra, còn có Berkeley YACC, tương thích với YACC gốc, nhưng không chia sẻ mã nguồn. Berkeley YACC có thể được tìm thấy trên bất kỳ hệ điều hành BSD mã nguồn mở nào.


2

Bò rừng trong một phần của dự án GNU. Và yacc được sử dụng như một tiện ích trên Berkeley Software Distribution (BSD), mặc dù tương thích với yacc, nhưng Lex và Yacc đã là dĩ vãng. Flex và bison được sử dụng rộng rãi ngày nay.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.