อ่าน 2 นาที
ตัวแยกวิเคราะห์ LR แบบง่าย
ใน วิทยาการคอมพิวเตอร์ ตัว แยกวิเคราะห์ LR แบบง่าย หรือ SLR เป็น ตัวแยกวิเคราะห์ LR ประเภทหนึ่งที่มี ตารางการแยกวิเคราะห์ ขนาดเล็ก...
ตัวแยกวิเคราะห์ LR แบบง่าย
ในวิทยาการคอมพิวเตอร์ตัว แยกวิเคราะห์ LR แบบง่ายหรือSLR เป็น ตัวแยกวิเคราะห์ LRประเภทหนึ่งที่มีตารางการแยกวิเคราะห์ ขนาดเล็ก และอัลกอริทึมการสร้างตัวแยกวิเคราะห์ที่ค่อนข้างง่าย เช่นเดียวกับตัวแยกวิเคราะห์ LR(1) ประเภทอื่นๆ ตัวแยกวิเคราะห์ SLR มีประสิทธิภาพมากในการค้นหาการแยกวิเคราะห์จากล่างขึ้นบน ที่ถูกต้องเพียงรายการเดียว ในการสแกนจากซ้ายไปขวาเพียงครั้งเดียวเหนือสตรีมอินพุต โดยไม่ต้องเดาหรือย้อนกลับ ตัวแยกวิเคราะห์ถูกสร้างขึ้นโดยอัตโนมัติจากไวยากรณ์ที่เป็นทางการสำหรับภาษา
SLR และวิธีการทั่วไปอื่นๆ เช่นLALR parserและCanonical LR parserมีวิธีการและตารางที่คล้ายคลึงกันในระหว่างการวิเคราะห์ไวยากรณ์ ความแตกต่างอยู่ที่อัลกอริทึมการวิเคราะห์ไวยากรณ์ทางคณิตศาสตร์ที่ใช้โดยเครื่องมือสร้าง parser เท่านั้น ตัวสร้าง SLR และ LALR สร้างตารางที่มีขนาดและสถานะ parser เหมือนกัน ตัวสร้าง SLR ยอมรับไวยากรณ์น้อยกว่าตัวสร้าง LALR เช่นyaccและBisonภาษาคอมพิวเตอร์หลายภาษาไม่ตรงกับข้อจำกัดของ SLR โดยตรง การปรับไวยากรณ์ตามธรรมชาติของภาษาให้เป็น รูปแบบ ไวยากรณ์ SLRต้องมีการประนีประนอมและเทคนิคการแก้ไขไวยากรณ์เพิ่มเติม ดังนั้นตัวสร้าง LALR จึงถูกใช้งานอย่างแพร่หลายมากกว่าตัวสร้าง SLR แม้ว่าจะเป็นเครื่องมือที่ซับซ้อนกว่าเล็กน้อยก็ตาม วิธีการ SLR ยังคงเป็นขั้นตอนการเรียนรู้ที่มีประโยชน์ในชั้นเรียนทฤษฎีคอมไพเลอร์ในระดับมหาวิทยาลัย
SLR และ LALR ได้รับการพัฒนาโดยFrank DeRemerเป็นครั้งแรกในการใช้งานจริงของทฤษฎีการแยกวิเคราะห์ LR ของDonald Knuth [ 1 ] [ 2 ] ตารางที่สร้างขึ้นสำหรับไวยากรณ์จริงโดยวิธี LR แบบเต็มรูปแบบมีขนาดใหญ่เกินกว่าจะใช้งานได้จริง ใหญ่กว่าหน่วยความจำคอมพิวเตอร์ส่วนใหญ่ในทศวรรษนั้น โดยมีสถานะการแยกวิเคราะห์มากกว่าวิธี SLR และ LALR ถึง 100 เท่าหรือมากกว่า[ 3 ]
ชุดการมองล่วงหน้า
เพื่อให้เข้าใจความแตกต่างระหว่าง SLR และ LALR จำเป็นต้องเข้าใจความคล้ายคลึงกันหลายประการและวิธีการที่ทั้งสองใช้ในการตัดสินใจแบบ shift-reduce (ดูบทความLR parser now สำหรับข้อมูลพื้นฐานนั้น จนถึงส่วนเกี่ยวกับlookahead sets ของการลดรูป )
ความแตกต่างประการหนึ่งระหว่าง SLR และ LALR คือวิธีการที่ตัวสร้างของทั้งสองระบบคำนวณชุดสัญลักษณ์อินพุตล่วงหน้าที่ควรปรากฏขึ้นต่อไป เมื่อใดก็ตามที่พบและลด กฎการผลิต ที่สมบูรณ์แล้ว
ตัวสร้าง SLR คำนวณการมองล่วงหน้าโดยใช้วิธีการประมาณค่าอย่างง่ายโดยอิงจากไวยากรณ์โดยตรง โดยไม่สนใจรายละเอียดของสถานะและการเปลี่ยนผ่านของตัวแยกวิเคราะห์แต่ละตัว ซึ่งจะไม่สนใจบริบทเฉพาะของสถานะตัวแยกวิเคราะห์ปัจจุบัน หากสัญลักษณ์ที่ไม่ใช่เทอร์มินั ล Sถูกใช้ในหลายตำแหน่งในไวยากรณ์ SLR จะจัดการตำแหน่งเหล่านั้นในลักษณะเดียวกันแทนที่จะจัดการทีละตำแหน่ง ตัวสร้าง SLR จะคำนวณFollow(S)เซตของสัญลักษณ์เทอร์มินัลทั้งหมดที่สามารถตามหลังการปรากฏของS ได้ทันที ในตารางการแยกวิเคราะห์ การลดรูปแต่ละครั้งเป็นSจะใช้ Follow(S) เป็นเซตการมองล่วงหน้า LR(1) เซตติดตามดังกล่าวถูกใช้โดยตัวสร้างสำหรับตัวแยกวิเคราะห์แบบบนลงล่าง LL ด้วยเช่นกัน ไวยากรณ์ที่ไม่มีความขัดแย้งระหว่าง shift/reduce หรือ reduce/reduce เมื่อใช้เซตติดตามเรียกว่าไวยากรณ์ SLR
ตัวสร้าง LALR คำนวณชุดการมองล่วงหน้าด้วยวิธีการที่แม่นยำกว่า โดยอาศัยการสำรวจกราฟของสถานะตัวแยกวิเคราะห์และการเปลี่ยนสถานะ วิธีนี้จะพิจารณาบริบทเฉพาะของสถานะตัวแยกวิเคราะห์ปัจจุบัน และปรับแต่งการจัดการกับการเกิดขึ้นของสัญลักษณ์ที่ไม่ใช่เทอร์มินัล S ในไวยากรณ์แต่ละครั้ง ดูบทความตัวแยกวิเคราะห์ LALRสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการคำนวณนี้ ชุดการมองล่วงหน้าที่คำนวณโดยตัวสร้าง LALR เป็นส่วนย่อยของ (และดีกว่า) ชุดโดยประมาณที่คำนวณโดยตัวสร้าง SLR หากไวยากรณ์มีข้อขัดแย้งในตารางเมื่อใช้ชุดติดตาม SLR แต่ไม่มีข้อขัดแย้งเมื่อใช้ชุดติดตาม LALR จะเรียกว่าไวยากรณ์ LALR
ตัวอย่าง
ไวยากรณ์ที่สามารถแยกวิเคราะห์ได้ด้วยตัวแยกวิเคราะห์ SLR แต่ไม่สามารถแยกวิเคราะห์ได้ด้วยตัวแยกวิเคราะห์ LR(0) คือไวยากรณ์ต่อไปนี้:
- (0) S → E
- (1) E → 1 E
- (2) E → 1
การสร้างตารางการกระทำและ goto ตามที่ทำสำหรับตัวแยกวิเคราะห์ LR(0) จะให้ชุดรายการและตารางดังต่อไปนี้:
- ชุดสินค้า 0
- ส → • อี
- + E → • 1 E
- + E → • 1
- ชุดสินค้าที่ 1
- E → 1 • E
- E → 1 •
- + E → • 1 E
- + E → • 1
- ชุดสินค้าที่ 2
- S → E •
- ชุดสินค้าที่ 3
- E → 1 E •
ตารางคำสั่งและตารางไปยังตำแหน่งที่ต้องการ:
| การกระทำ | โกโตะ | ||
|---|---|---|---|
| สถานะ | 1 | $ | อี |
| 0 | s1 | 2 | |
| 1 | s1/r2 | ร2 | 3 |
| 2 | แอค | ||
| 3 | ร1 | ร1 | |
ดังที่สังเกตได้ มีความขัดแย้งระหว่าง shift และ reduce สำหรับสถานะ 1 และเทอร์มินัล '1' เกิดขึ้นเนื่องจากเมื่อสร้างตารางแอ็กชันสำหรับตัวแยกวิเคราะห์ LR(0) แอ็กชัน reduce จะถูกแทรกตามแต่ละแถว อย่างไรก็ตาม การใช้ follow set สามารถเพิ่มแอ็กชัน reduce ได้ในระดับที่ละเอียดกว่า follow set สำหรับไวยากรณ์นี้:
| เครื่องหมาย | เอส | อี | 1 |
|---|---|---|---|
| กำลังติดตาม | $ | $ | 1 ดอลลาร์ |
จำเป็นต้องเพิ่มคำสั่งลด (reduce) ลงในคอลัมน์การดำเนินการ (action column) เฉพาะเจาะจงก็ต่อเมื่อการดำเนินการนั้นอยู่ในชุดการติดตาม (flow set) ที่เชื่อมโยงกับคำสั่งลดนั้นเท่านั้น อัลกอริทึมนี้อธิบายว่าจำเป็นต้องเพิ่มคำสั่งลดลงในคอลัมน์การดำเนินการหรือไม่:
ฟังก์ชัน mustBeAdded(reduceAction, action) { หมายเลขกฎ = ค่าการลดการกระทำ; ruleSymbol = rules[ruleNumber].leftHandSide; ส่งคืน (การกระทำใน followSet(ruleSymbol)) } ตัวอย่างเช่นmustBeAdded(r2, "1")เป็นเท็จ เพราะด้านซ้ายของกฎข้อที่ 2 คือ "E" และ 1 ไม่อยู่ในเซตติดตามของ E ในทางตรงกันข้ามmustBeAdded(r2, "$")เป็นจริง เพราะ "$" อยู่ในเซตติดตามของ E
โดยการใช้ mustBeAdded ในแต่ละการดำเนินการลด (reduce action) ในตารางการดำเนินการ ผลลัพธ์ที่ได้คือตารางการดำเนินการที่ปราศจากข้อขัดแย้ง:
| การกระทำ | โกโตะ | ||
|---|---|---|---|
| สถานะ | 1 | $ | อี |
| 0 | s1 | 2 | |
| 1 | s1 | ร2 | 3 |
| 2 | แอค | ||
| 3 | ร1 | ||
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ตัวแยกวิเคราะห์ LR แบบง่าย
ใน วิทยาการคอมพิวเตอร์ ตัว แยกวิเคราะห์ LR แบบง่าย หรือ SLR เป็น ตัวแยกวิเคราะห์ LR ประเภทหนึ่งที่มี ตารางการแยกวิเคราะห์ ขนาดเล็ก...
ชุดการมองล่วงหน้า
เพื่อให้เข้าใจความแตกต่างระหว่าง SLR และ LALR จำเป็นต้องเข้าใจความคล้ายคลึงกันหลายประการและวิธีการที่ทั้งสองใช้ในการตัดสินใจแบบ shift-reduce (ดูบทความ LR parser now สำหรับข้อมูลพื้นฐานนั้น จนถึงส่วนเกี่ยวกับ lookahead sets ของการลดรูป )
ตัวอย่าง
ไวยากรณ์ที่สามารถแยกวิเคราะห์ได้ด้วยตัวแยกวิเคราะห์ SLR แต่ไม่สามารถแยกวิเคราะห์ได้ด้วยตัวแยกวิเคราะห์ LR(0) คือไวยากรณ์ต่อไปนี้:
ดูเพิ่มเติม
ตัวแยกวิเคราะห์ LR ตัวแยกวิเคราะห์ LL ตัวแยกวิเคราะห์ LALR ไวยากรณ์ SLR ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Simple_LR_parser&oldid=1307255274 "