ตัววิเคราะห์การกระจาย LR(1) Warattapop Chainate
LR(1) Parsing LR(1) parsing มีองค์ประกอบและขั้นตอนวิธีเหมือนกับ SLR(1) parsing ต่างกันเพียงวิธีการสร้าง action และ goto tables เท่านั้น แต่... ก่อนจะไปสร้างตาราง เราต้องรู้จัก item LR(1) closure set goto set และ กลุ่มคาโนนิคอล LR(1)
Item LR(1) และ Closure ไอเท็ม LR(1) ประกอบด้วยสองส่วน ส่วนแรกเหมือนกับไอเท็ม LR(0) และส่วนที่สองเป็น terminal sym หรือ $ โดยจะเขียนอยู่ในรูป [ส่วนแรก, ส่วนที่สอง] เช่น [X, a] Closure(I) สำหรับ LR(1) เพิ่มสมาชิกทุกตัวใน I เข้าไปเป็นสมาชิกของ closure(I) พิจารณาไอเท็ม LR(1) ที่เป็นสมาชิกใน closure(I) ถ้ามี อยู่หน้า non-terminal sym สมมติว่าคือ [XB, a] และ B มีกฎ B ให้เพิ่มไอเท็ม LR(1) คือ [B, b] เมื่อ b FIRST(a) เข้าไปเป็นสมาชิกของ closure(I) ** หากมี $ ให้มอง $ เป็น terminal sym ตัวหนึ่ง FIRST($)={$} ทำข้อ b ซ้ำๆ จนกว่าจะไม่มีไอเท็ม LR(1) ใหม่เพิ่มเข้าไปใน closure(I) จงหา closure({[S’S, $]})
goto for LR(1) goto(I, X) เมื่อ I เป็นเซตของไอเท็ม LR(1) และ X เป็น non-terminal หรือ terminal sym จะมีวิธีการหาสมาชิกดังนี้ นำไอเท็ม LR(1) ใน I ที่มี ติดอยู่ข้างหน้า X มารวมกันเป็นเซต เลื่อน ไปไว้หลัง X แล้วหา closure ของเซตดังกล่าว จาก กำหนดให้ I3={[SbA, $], [Sbda, $], [Ad, $], [A, $]} จงหาเซตของ goto (0) S’ S (1-4) S Aa | bA | bda | (5-6) A d |
กลุ่มคาโนนิคอล LR(1) สำหรับไวยากรณ์ G=(N, T, S, P) และ Ag (N{S’}, T, S’, P{S’S}) กำหนดให้ C เป็นเซตของ ไอเท็ม LR(1) ของ Ag G’ ซึ่งเรียกว่า “กลุ่มคาโนนิคอล LR(0) ของ Ag G’” C := {closure({[S’S, $]})}; ทำซ้ำๆ จนกว่าจะไม่มีสมาชิกใหม่เพิ่มเข้าไปใน C ดังนี้ สำหรับ (สมาชิก I แต่ละตัวใน C) สำหรับ (สัญลักษณ์สิ้นสุด และสัญลักษณ์ไม่สิ้นสุด X แต่ละตัว) ถ้า (goto(I, X) และ goto(I, X)C) แล้ว เพิ่ม goto(I, X) เข้าไปในสมาชิกตัวใหม่ใน C;
I0={[S’S, $], [SAa, $], [SbA, $], [Sbda, $], [S, $], [Ad, a], [A, a]}