Flex / Lex และ Yacc / Bison ต่างกันอย่างไร


122

Flex & Lex กับ Yacc & Bison ต่างกันอย่างไร ฉันค้นหาอินเทอร์เน็ตอย่างดุเดือดและไม่พบคำตอบที่ชัดเจน

ฉันสามารถติดตั้ง Lex และ Yacc แท้บน Ubuntu ได้หรือฉันสามารถติดตั้งได้เฉพาะ flex และ bison ฉันสับสน.

  • Lex หรือ Yacc ยังคงได้รับการดูแลโดยใครบางคนหรือไม่?
  • ทั้งหมดนี้ฟรีหรือไม่?
  • หาก Lex ไม่ฟรีทำไมฉันถึงติดตั้งในการแจกจ่าย Ubuntu ของฉัน

    lex --version
    lex 2.5.35
    

3
ไม่มี lex เวอร์ชัน 2.5.35 - คุณกำลังใช้เวอร์ชัน flex 2.5.35 เพียงระบุว่าตัวเองเป็น 'lex' หากคุณเรียกมันเป็น 'lex'
Chris Dodd

คำตอบ:


81

มีความแตกต่างบางประการระหว่าง Lex และ Flex แต่คุณต้องใช้ Lex ในทางที่ผิดเพื่อพบปัญหากับ Flex (ฉันมีโปรแกรมที่ใช้ Lex ในทางที่ผิดและไม่ทำงานภายใต้ Flex) นี่คือส่วนใหญ่ในด้านการมองหาอินพุต; ใน Lex คุณสามารถระบุรหัสอินพุตของคุณเองและแก้ไขสตรีมอักขระได้ Flex จะไม่ยอมให้คุณทำอย่างนั้น

Yacc และ Bison ค่อนข้างเข้ากันได้ดีแม้ว่า Bison จะมีเทคนิคพิเศษบางอย่างที่สามารถทำได้

คุณอาจไม่พบสำเนาที่ถูกต้องของ Lex และ Yacc (เวอร์ชันดั้งเดิมของ AT&T) เพื่อติดตั้งบน Ubuntu ฉันไม่จำเป็นต้องบอกว่ามันเป็นไปไม่ได้ แต่ฉันไม่รู้ Flex และ Bison พร้อมใช้งานและเทียบเท่าสำหรับวัตถุประสงค์ส่วนใหญ่ นอกจากนี้คุณยังสามารถค้นหาโปรแกรมทางเลือกที่หลากหลายและเทียบเท่าโดยประมาณจากโลก BSD

Lex และ Yacc ได้รับการดูแลโดยผู้ได้รับอนุญาต Unix SVRx - บริษัท ต่างๆเช่น IBM (AIX), HP (HP-UX) และ Sun (Solaris) ได้แก้ไขเวอร์ชันของ Lex และ Yacc ตามคำสั่ง MKS ยังมี MKS Lex และ MKS Yacc; อย่างไรก็ตาม Yacc อย่างน้อยก็มีส่วนขยายที่ไม่ได้มาตรฐาน

Flex และ Bison ฟรี (AT&T) Lex และ Yacc ไม่ใช่


4
ข้อมูลเกี่ยวกับ Yacc ไม่ถูกต้อง Berkeley มี Yacc ซึ่งมีอยู่ภายใต้ใบอนุญาต BSD บนระบบปฏิบัติการ BSD แบบโอเพนซอร์สทั้งหมด ฉันลดคะแนนในบัญชีนี้ แต่ถ้าคำตอบได้รับการแก้ไขเร็วพอฉันจะลบการโหวตลง
Daniel C. Sobral

2
@ Daniel: AFAIK, AT&T Yacc ไม่สามารถหาได้จาก Berkeley - สิ่งที่คุณได้รับจาก Berkeley คือ Berkeley Yacc ฉันจะชี้แจงคำตอบเพื่อสะท้อนให้เห็นว่า
Jonathan Leffler

1
ในการดิ้นคุณสามารถสลับบัฟเฟอร์อินพุตได้อย่างไม่ลำบาก (ฉันทำครั้งเดียวเพื่อจัดการเป็นหลัก#include) หนังสือ O'Reilly ของฉันเกี่ยวกับ lex & yacc (ไม่ได้อยู่ที่นี่ขออภัย) กล่าวว่าเป็นไปได้เฉพาะใน lex ผ่านการแฮ็กที่น่ารังเกียจ
vonbrand

33

Bison คือการใช้งาน GNU / ส่วนขยายของ Yacc Flex เป็นผู้สืบทอดของ Lex ไม่ว่าในกรณีใดการใช้ bison / flex ก็ใช้ได้ (และแนะนำ)


1
นอกจากนี้ byacc การใช้งาน Berkeley ของ yacc ยังมีให้บริการอย่างกว้างขวาง (ฉันเห็นในรายการที่เก็บ Debian ของฉัน)
Michael Ekstrand

1
ดิ้นถูกเรียกว่าเพราะมันเป็น (เป็น?) มากเร็วกว่าแนนเชี่ยล มีหลายนามสกุลและไฟล์ที่สร้างขึ้นจะไม่คล้ายกันเลย (เช่นแฮ็คที่น่าเกลียดใน lex ไม่ทำงานกับ flex และในทางกลับกัน)
vonbrand

11

ในระบบลินุกซ์ส่วนใหญ่ (ทั้งหมด?) "Lex" เป็นลิงก์สัญลักษณ์สำหรับเฟล็กซ์ โดยทั่วไปเป็นเพียงชื่อที่แตกต่างจากเวอร์ชันฟรี


1
ในระบบของฉัน (Arch Linux) ไบนารีทั้งสองไม่ทำงานในลักษณะเดียวกัน น่าจะเป็นคุณลักษณะที่เข้ากันได้กับ lex
Danilo Bargen

10

YACC มีให้บริการภายใต้ใบอนุญาตโอเพนซอร์สจากทั้งแผน 9 และ Open Solaris นอกจากนี้ยังมี Berkeley YACC ซึ่งเข้ากันได้กับ YACC ดั้งเดิม แต่ไม่แชร์ซอร์สโค้ด Berkeley YACC สามารถพบได้ในระบบปฏิบัติการ BSD แบบโอเพนซอร์ส


2

วัวกระทิงในส่วนหนึ่งของโครงการ GNU และ yacc ถูกใช้เป็นยูทิลิตี้บน Berkeley Software Distribution (BSD) แม้ว่าจะเข้ากันได้กับ yacc แต่ Lex และ Yacc ก็เป็นอดีตไปแล้ว ดิ้นและวัวกระทิงใช้กันอย่างแพร่หลายในปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.