กลับไปหน้าบทความ

อ่าน 5 นาที

ยัค

Yacc ( Yet Another Compiler-Compiler ) เป็นโปรแกรมคอมพิวเตอร์สำหรับระบบปฏิบัติการUnix ที่พัฒนาโดย Stephen C.

ยัค

ยัค
ชื่ออื่นๆBell Labs Yacc; AT&T Yacc
ผู้เขียนต้นฉบับสตีเฟน ซี. จอห์นสัน
เขียนเป็นซี
ระบบปฏิบัติการยูนิก , ระบบปฏิบัติการคล้ายยูนิก , Plan 9 , อินเฟอร์โน
แพลตฟอร์มข้ามแพลตฟอร์ม
พิมพ์สั่งการ
ใบอนุญาตแผนที่ 9: ใบอนุญาต MIT
ที่เก็บข้อมูล
  • www.tuhs.org/cgi-bin/utree.pl?file=V6%2Fusr%2Fsource%2Fyacc

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 ]

ดูเพิ่มเติม

  • สภาพ แวดล้อมสำหรับการเรียนรู้และทดสอบไวยากรณ์
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Yacc&oldid=1358164322 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ยัค

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...