2009-03-08 13 views
85

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

Tôi có thể cài đặt Lex và Yacc tinh khiết trên Ubuntu hay không hoặc chỉ có thể cài đặt flex và bison. Tôi bị bối rối.

  • Lex hoặc Yacc vẫn đang được duy trì bởi ai đó?
  • Tất cả đều miễn phí?
  • Nếu Lex không tự do tại sao tôi cài đặt nó trên bản phân phối Ubuntu?

    lex --version 
    lex 2.5.35 
    
+2

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

Trả lời

55

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 sự cố với Flex. (Tôi có một chương trình mà lạm dụng Lex và không hoạt động theo Flex, do đó.) Đây là chủ yếu trong lĩnh vực đầu vào 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 tương đối chặt chẽ, mặc dù Bison có một số thủ thuật phụ mà nó có thể thực hiện.

Bạn có thể không tìm được bản sao hợp pháp (bản gốc, AT & phiên bản 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 nhận thức được điều đó. Flex và Bison 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 các 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 giấy phép SVRx của Unix - các công ty như IBM (AIX), HP (HP-UX) và Sun (Solaris) có các phiên bản sửa đổi của Lex và Yacc. 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 hoàn toàn miễn phí. (AT & T) Lex và Yacc thì không.

+3

Thông tin về Yacc không chính xác. Berkeley có một Yacc, có mặt và có sẵn theo giấy phép BSD trên tất cả các hệ điều hành BSD nguồn mở. Tôi đã downvoted trên tài khoản này, nhưng nếu câu trả lời được sửa chữa đủ nhanh, tôi sẽ loại bỏ downvote. –

+1

@Daniel: AFAIK, AT & T Yacc không thể lấy được từ Berkeley - những gì 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 đó. –

+0

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

23

Bison là GNU thực hiện/gia hạn Yacc, Flex là sự kế thừa của Lex. Trong cả hai trường hợp, nó là tốt (và khuyến khích) để sử dụng bison/flex.

+1

Ngoài ra, byacc, việc triển khai Berkeley của yacc, có sẵn rộng rãi (tôi thấy nó trong danh sách kho Debian). –

+0

flex được gọi là bởi vì nó là (là?) _much_ nhanh hơn lex. Nó có một số phần mở rộng, và các tập tin được tạo ra không llok ở tất cả tương tự (tức là, hacks xấu xí trong lex không làm việc với flex và viceversa). – vonbrand

8

Trên hầu hết (tất cả?) Các hệ thống Linux, "Lex" thực sự là một liên kết tượng trưng cho flex. Về cơ bản, nó chỉ là một 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 theo cùng một cách. Có thể là một tính năng tương thích lex. –

5

YACC có sẵn theo giấy phép nguồn mở từ cả Kế hoạch 9 và Mở Solaris. Ngoài ra, cũng 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 nguồn mở nào.