อ่าน 5 นาที
ยัค
Yacc ( Yet Another Compiler-Compiler ) เป็นโปรแกรมคอมพิวเตอร์สำหรับระบบปฏิบัติการUnix ที่พัฒนาโดย Stephen C.
ยัค
| ยัค | |
|---|---|
| ชื่ออื่นๆ | Bell Labs Yacc; AT&T Yacc |
| ผู้เขียนต้นฉบับ | สตีเฟน ซี. จอห์นสัน |
| เขียนเป็น | ซี |
| ระบบปฏิบัติการ | ยูนิก , ระบบปฏิบัติการคล้ายยูนิก , Plan 9 , อินเฟอร์โน |
| แพลตฟอร์ม | ข้ามแพลตฟอร์ม |
| พิมพ์ | สั่งการ |
| ใบอนุญาต | แผนที่ 9: ใบอนุญาต MIT |
| ที่เก็บข้อมูล |
|
Yacc ( Yet Another Compiler-Compiler ) เป็นโปรแกรมคอมพิวเตอร์สำหรับระบบปฏิบัติการUnix ที่พัฒนาโดย Stephen C. Johnsonเป็นตัวสร้างตัวแยกวิเคราะห์แบบมองไปข้างหน้าจากซ้ายไปขวาแบบขวาสุด (LALR)โดยสร้างตัวแยกวิเคราะห์ LALR (ส่วนหนึ่งของคอมไพเลอร์ที่พยายามทำให้รหัสต้นฉบับ มีความหมายทางไวยากรณ์ ) โดยอิงจากไวยากรณ์ที่เป็นทางการซึ่งเขียนในรูปแบบที่คล้ายกับรูปแบบ Backus–Naur (BNF) [ 1 ] Yacc มีให้เป็นยูทิลิตี้มาตรฐานใน BSD และ AT&T Unix [ 2 ] การแจกจ่าย Linuxที่ใช้GNUมีBisonซึ่ง เป็น ตัวทดแทน Yacc ที่เข้ากันได้กับเวอร์ชัน ก่อนหน้า[ 3 ]
ประวัติศาสตร์
ในช่วงต้นทศวรรษ 1970 Stephen C. Johnsonนักวิทยาศาสตร์คอมพิวเตอร์ที่Bell Labs / AT&Tได้พัฒนา Yacc ขึ้นมา เนื่องจากเขาต้องการแทรกตัว ดำเนินการ exclusive orลงในคอมไพเลอร์ภาษา B [ 4 ] (ซึ่งพัฒนาโดยใช้คอมไพเลอร์-คอมไพเลอร์TMGของMcIlroy [ 5 ] ) แต่ปรากฏว่ามันเป็นงานที่ยาก ด้วยเหตุนี้ เขาจึงได้รับคำแนะนำจากAl Aho เพื่อนร่วมงานของเขาที่ Bell Labs ให้ ศึกษา ผลงานของDonald Knuth เกี่ยวกับ การแยกวิเคราะห์ LRซึ่งเป็นพื้นฐานสำหรับ Yacc [ 4 ] Yacc ได้รับอิทธิพลจาก[ 6 ]และได้รับชื่อโดยอ้างอิงถึงคอมไพเลอร์-คอมไพเลอร์ TMG [ 7 ]
Yacc เดิมทีเขียนด้วยภาษาโปรแกรม Bแต่ต่อมาAlan Snyder ได้เขียนใหม่ด้วย ภาษา C [ 5 ]ปรากฏเป็นส่วนหนึ่งของUnix เวอร์ชัน 3 [ 8 ]และคำอธิบายฉบับเต็มของ Yacc ได้รับการเผยแพร่ในปี 1975 [ 6 ]
จอห์นสันใช้ Yacc เพื่อสร้างPortable C Compiler [ 8 ] บียาร์เน สโตรสทรุปพยายามใช้ Yacc เพื่อสร้างข้อกำหนดอย่างเป็นทางการของC++แต่ "พ่ายแพ้ต่อไวยากรณ์ของ C" [ 9 ] แม้จะพบว่าไม่เหมาะสมสำหรับข้อกำหนดอย่างเป็นทางการของภาษา แต่สโตรสทรุปก็ยังคงใช้ Yacc เพื่อนำ Cfrontมาใช้ ซึ่งเป็นการนำ C++ มาใช้ครั้งแรก[ 10 ]
ในการสัมภาษณ์เมื่อปี 2551 จอห์นสันได้สะท้อนว่า " สิ่งที่ผมภาคภูมิใจที่สุดคือการมีส่วนร่วมของ Yacc ในการเผยแพร่UnixและC " [ 11 ]
คำอธิบาย
อินพุตของ Yacc คือไวยากรณ์ที่มีส่วนของ โค้ดภาษา C (เรียกว่า "แอ็กชัน") แนบอยู่กับกฎต่างๆ เอาต์พุตของ Yacc คือตัวแยกวิเคราะห์แบบ shift-reduceในภาษา C ที่จะเรียกใช้ส่วนของโค้ดภาษา C ที่เกี่ยวข้องกับแต่ละกฎทันทีที่ตรวจพบกฎนั้น แอ็กชันทั่วไปเกี่ยวข้องกับการสร้างแผนผังการแยกวิเคราะห์ยกตัวอย่างเช่น จากตัวอย่างของ Johnson ถ้าโหนด call (label, left, right)สร้างโหนดแผนผังการแยกวิเคราะห์แบบไบนารีที่มีป้ายกำกับและลูกที่ระบุไว้ กฎนั้นก็จะ...
expr : expr '+' expr { $$ = node ( '+' , $1 , $3 ); }รับรู้นิพจน์ผลรวมและสร้างโหนดสำหรับนิพจน์เหล่านั้น ตัวระบุพิเศษ$$ , $1และ$3อ้างอิงถึงรายการบนสแต็ก ของตัวแยก วิเคราะห์[ 6 ]
Yacc สร้างเฉพาะตัวแยกวิเคราะห์ (ตัววิเคราะห์วลี) ซึ่งสามารถใช้ได้เพียงอย่างเดียวในกรณีของการแยกวิเคราะห์แบบไม่ใช้สแกนเนอร์อย่างไรก็ตาม การวิเคราะห์ไวยากรณ์แบบเต็มรูปแบบโดยทั่วไปต้องใช้ตัววิเคราะห์คำศัพท์ ภายนอก เพื่อดำเนินการขั้นตอนการแบ่งคำก่อน (การวิเคราะห์คำ) จากนั้นจึงตามด้วยขั้นตอนการแยกวิเคราะห์ที่ถูกต้อง[ 6 ]ตัวสร้างตัววิเคราะห์คำศัพท์ เช่นLexหรือFlexมีให้ใช้งานอย่างแพร่หลายสำหรับวัตถุประสงค์นี้ มาตรฐาน IEEE POSIX P1003.2 กำหนดฟังก์ชันการทำงานและข้อกำหนดสำหรับทั้ง Lex และ Yacc [ 12 ]
บางเวอร์ชันของ AT&T Yacc ได้กลายเป็นโอเพนซอร์สแล้ว ตัวอย่างเช่นซอร์สโค้ดมีให้ใช้งานพร้อมกับการแจกจ่ายมาตรฐานของPlan 9 [ 13 ]
ผลกระทบ
Yacc และโปรแกรมที่คล้ายกัน (ส่วนใหญ่เป็นการเขียนใหม่) ได้รับความนิยมอย่างมาก Yacc เองเคยมีให้ใช้เป็นตัวสร้างตัวแยกวิเคราะห์เริ่มต้นในระบบ Unix ส่วนใหญ่ แม้ว่าจะถูกแทนที่ด้วยโปรแกรมที่ใหม่กว่าและเข้ากันได้เป็นส่วนใหญ่ เช่นBerkeley Yacc , GNU Bison , MKS Yacc และ Abraxas PCYACC เวอร์ชันที่อัปเดตของ AT&T Yacc ดั้งเดิมรวมอยู่ใน โครงการ OpenSolaris ของ Sun แต่ละโปรแกรมมีการปรับปรุงเล็กน้อยและคุณสมบัติเพิ่มเติมเหนือ Yacc ดั้งเดิม แต่แนวคิดและไวยากรณ์พื้นฐานยังคงเหมือนเดิม[ 14 ]
Yacc ยังเป็นหนึ่งในเครื่องมือ UNIX หลายอย่างที่มีให้ใช้งานสำหรับระบบปฏิบัติการUNOS ของ Charles River Data Systems ภายใต้ ใบอนุญาตของBell Laboratories [ 15 ]
ภาษาต่างๆ ที่ถูกนำไปใช้ครั้งแรกด้วย Yacc ได้แก่AWK , C++ , [ 10 ] eqnและPic [ 16 ] [ 11 ] Yacc ยังถูกใช้บน Unix เพื่อนำ คอมไพเลอ ร์ Portable C มาใช้ รวมถึงตัวแยกวิเคราะห์สำหรับภาษาโปรแกรมต่างๆ เช่นFORTRAN 77 , Ratfor , APL , bc , m4เป็นต้น[ 8 ] [ 17 ]
Yaccยังได้รับการเขียนใหม่สำหรับภาษาอื่นๆ รวมถึง OCaml [ 18 ] Ratfor , ML , Ada , Pascal , Java , PHP , Python , Ruby , Go [ 19 ] Common Lisp [ 20 ]และErlang [ 21 ]
- Berkeley Yacc : การใช้งาน Yacc ของ Berkeley ได้รับความนิยมมากกว่า Yacc ของ AT&T อย่างรวดเร็วเนื่องจากประสิทธิภาพและไม่มีข้อจำกัดในการใช้งานซ้ำ[ 22 ]
- ตัวแยกวิเคราะห์ LALR : อัลกอริทึมการแยกวิเคราะห์พื้นฐานในตัวแยกวิเคราะห์ที่สร้างโดย Yacc
- Bison : เวอร์ชัน GNU ของ Yacc
- Lex (และFlex ซึ่งเป็นตัววิเคราะห์คำศัพท์ ) เป็นตัวแยกวิเคราะห์โทเค็นที่นิยมใช้ร่วมกับ Yacc (และ Bison)
- BNFเป็นเมตาไวยากรณ์ที่ใช้ในการแสดงไวยากรณ์แบบไม่ขึ้นกับบริบทกล่าวคือ เป็นวิธีการที่เป็นทางการในการอธิบายภาษาแบบไม่ขึ้นกับบริบท
- PLY (Python Lex-Yacc)เป็นการนำ Lex และ Yacc มาใช้ในรูปแบบอื่นในภาษา Python
ดูเพิ่มเติม
ลิงก์ภายนอก
- สภาพ แวดล้อมสำหรับการเรียนรู้และทดสอบไวยากรณ์
- – เอกสารอ้างอิงเชลล์และยูทิลิตี้จากข้อกำหนดยูนิกซ์ฉบับเดียวเวอร์ชัน 5 จากThe Open Group
- – คู่มือโปรแกรมเมอร์Plan 9 เล่ม 1
- – คู่มือคำสั่งทั่วไปของเกม Inferno
- – คู่มือคำสั่งทั่วไปของ Linuxจาก ManKier.com
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ยัค
Yacc ( Yet Another Compiler-Compiler ) เป็นโปรแกรมคอมพิวเตอร์สำหรับระบบปฏิบัติการUnix ที่พัฒนาโดย Stephen C.
ประวัติศาสตร์
ในช่วงต้นทศวรรษ 1970 Stephen C. Johnson นักวิทยาศาสตร์คอมพิวเตอร์ที่ Bell Labs / AT&T ได้พัฒนา Yacc ขึ้นมา เนื่องจากเขาต้องการแทรกตัว ดำเนินการ exclusive or ลงในคอมไพเลอร์ ภาษา B [ 4 ] (ซึ่งพัฒนาโดยใช้คอมไพเลอร์-คอมไพเลอร์ TMG ของ McIlroy [ 5 ] )...
คำอธิบาย
อินพุตของ Yacc คือไวยากรณ์ที่มีส่วนของ โค้ดภาษา C (เรียกว่า "แอ็กชัน") แนบอยู่กับกฎต่างๆ เอาต์พุตของ Yacc คือ ตัวแยกวิเคราะห์แบบ shift-reduce ในภาษา C ที่จะเรียกใช้ส่วนของโค้ดภาษา C ที่เกี่ยวข้องกับแต่ละกฎทันทีที่ตรวจพบกฎนั้น...
ผลกระทบ
Yacc และโปรแกรมที่คล้ายกัน (ส่วนใหญ่เป็นการเขียนใหม่) ได้รับความนิยมอย่างมาก Yacc เองเคยมีให้ใช้เป็นตัวสร้างตัวแยกวิเคราะห์เริ่มต้นในระบบ Unix ส่วนใหญ่ แม้ว่าจะถูกแทนที่ด้วยโปรแกรมที่ใหม่กว่าและเข้ากันได้เป็นส่วนใหญ่ เช่น Berkeley Yacc , GNU Bison , MKS Yacc...