ไวยากรณ์นี้ LL เป็นอย่างไร (1)


12

นี่เป็นคำถามจาก Dragon Book นี่คือไวยากรณ์:

S→AaAข|BขBa
A→ε
B→ε

คำถามถามว่าจะแสดงได้อย่างไรว่าเป็น LL (1) แต่ไม่ใช่ SLR (1)

เพื่อพิสูจน์ว่าเป็น LL (1) ฉันพยายามสร้างตารางการแยกวิเคราะห์ แต่ฉันได้รับการผลิตหลายรายการในเซลล์ซึ่งขัดแย้งกัน

โปรดบอกว่า LL (1) นี้เป็นอย่างไรและจะพิสูจน์ได้อย่างไร


6
ฉันไม่คุ้นเคยกับไวยากรณ์มาก แต่ดูเหมือนว่าภาษาของไวยากรณ์นี้มี จำกัด L={ab,ba}
— Nejc

@Nejc: ใช่มันดูเหมือนว่า!
— Vinayak Garg

คำตอบ:


11

ก่อนอื่นเราจะให้หมายเลขโปรดักชั่นของคุณ

1 S→AaAb
2 S→BbBa
3 A→ε
4 B→ε

ลองคำนวณชุดแรกและติดตามก่อน สำหรับตัวอย่างเล็ก ๆ เช่นสิ่งเหล่านี้การใช้สัญชาตญาณเกี่ยวกับชุดเหล่านี้ก็เพียงพอแล้ว

FผมRST(S)={a,ข}FผมRST(A)={}FผมRST(B)={}FOLLOW(A)={a,ข}FOLLOW(B)={a,ข}

ทีนี้ลองคำนวณ LL(1)โต๊ะ. ตามคำนิยามถ้าเราไม่ได้รับความขัดแย้งไวยากรณ์คือLL(1).

    a | b |
-----------
S | 1 | 2 |
A | 3 | 3 |
B | 4 | 4 |

เนื่องจากไม่มีความขัดแย้งไวยากรณ์คือ LL(1).

ตอนนี้สำหรับ SLR(1)โต๊ะ. ก่อนอื่นLR(0) หุ่นยนต์

0S→∙AaAขS→∙BขBaA→∙B→∙A⟹1B⟹5
1 รัฐS→A∙aAขa⟹2
รัฐ 2S→Aa∙AขA→∙A⟹3
รัฐ 3S→AaA∙ขข⟹4
รัฐ 4S→AaAข∙ข
รัฐ 5S→B∙ขBaข⟹6
รัฐ 6S→Bข∙BaB→∙B⟹7
รัฐ 7S→BขB∙aa⟹8
8 รัฐS→BขBa∙

และจากนั้น SLR(1) table (I assume S สามารถตามด้วยอะไรก็ได้)

    a     | b     | A | B |
---------------------------
0 | R3/R4 | R3/R4 | 1 | 5 |
1 | S2    |       |   |   |
2 | R3    | R3    | 3 |   |
3 |       | S4    |   |   |
4 | R1    | R1    |   |   |
5 |       | S4    |   |   |
6 | R4    | R4    |   | 7 |
7 | S8    |       |   |   |
8 | R2    | R2    |   |   |

มีข้อขัดแย้งในสถานะ 0 ดังนั้นไวยากรณ์จึงไม่ใช่ SLR(1). สังเกตว่าถ้าLALR(1) ถูกนำมาใช้แทนจากนั้นความขัดแย้งทั้งสองจะได้รับการแก้ไขอย่างถูกต้อง: ในสถานะ 0 บน lookahead a LALR(1) จะใช้เวลา R3 และใน lookahead ข มันจะใช้ R4

สิ่งนี้ก่อให้เกิดคำถามที่น่าสนใจว่ามีไวยากรณ์อยู่หรือไม่ LL(1) แต่ไม่ LALR(1)ซึ่งเป็นกรณี แต่ไม่ใช่เรื่องง่ายที่จะหาตัวอย่างของ


ขอบคุณ! ฉันสร้าง First & Follow อย่างถูกต้อง แต่ฉันทำผิดพลาดในการสร้างตาราง
— Vinayak Garg

10

หากคุณไม่ถูกถามคุณไม่จำเป็นต้องสร้างตาราง LL (1) เพื่อพิสูจน์ว่าเป็นไวยากรณ์ LL (1) คุณเพียงแค่คำนวณชุด FIRST / FOLLOW ตามที่ Alex ทำ:

FIRST⁡(S)=a,ขFIRST⁡(A)=εFIRST⁡(B)=εติดตาม⁡(A)=a,ขติดตาม⁡(B)=a,ข

จากนั้นตามนิยามไวยากรณ์ LL (1) จะต้อง:

  1. ถ้า A⇒a และ A⇒ข เป็นสองกฎที่แตกต่างกันของไวยากรณ์แล้วมันควรจะเป็นอย่างนั้น FIRST⁡(a)∩FIRST⁡(ข)=∅. ดังนั้นทั้งสองชุดจึงไม่มีองค์ประกอบที่เหมือนกัน
  2. หากสำหรับสัญลักษณ์ใดที่ไม่ใช่ขั้ว A คุณมี Α⇒* * * *εแล้วมันควรจะเป็นอย่างนั้น FIRST⁡(A)∩ติดตาม⁡(A)=∅. ดังนั้นหากไม่มีการผลิตเป็นศูนย์สำหรับสัญลักษณ์ที่มินัลดังนั้นชุด FIRST และ FOLLOW จะไม่สามารถมีองค์ประกอบทั่วไปได้

ดังนั้นสำหรับไวยากรณ์ที่กำหนด:

  1. เรามี FIRST⁡(AaAข)∩FIRST⁡(BขBa)=∅ ตั้งแต่ FIRST⁡(AaAข)={a} ในขณะที่ FIRST⁡(BขBa)={ข} และพวกเขาไม่มีองค์ประกอบทั่วไป
  2. FIRST⁡(A)∩ติดตาม⁡A)=∅ ตั้งแต่ FIRST⁡(A)={a,ข} ในขณะที่ ติดตาม⁡(A)=∅, และตอนนี้ FIRST⁡(B)∩ติดตาม⁡(B)=∅ ตั้งแต่ FIRST⁡(B)={ε} ในขณะที่ ติดตาม⁡(B)={a,ข}.

สำหรับการวิเคราะห์ SLR (1) ฉันคิดว่ามันไร้ที่ติ!


ยินดีต้อนรับ! เพื่อปรับปรุงคำตอบนี้ทำไมคุณไม่ใช้สิ่งที่คุณระบุไวยกรณ์ไว้ในมือ?
— กราฟิลส์

มีความสุขที่ได้อยู่ที่นี่ !! ตอบคำขอของคุณและฉันคิดว่าฉันให้คำอธิบายอย่างละเอียด!
— Ethan

ขอบคุณ! โปรดทราบว่าเราสามารถใช้ LaTeX ได้ที่นี่เนื่องจากฉันได้ทำการแก้ไขสำหรับคณิตศาสตร์ของคุณ
— กราฟิลส์

ว้าวขอบคุณ! นี่คือคำอธิบายที่ดี แต่ฉันคิดว่ามีข้อผิดพลาดบางอย่างในแอปพลิเคชัน ไม่ใช่ First (A) = {epsilon} ใช่หรือไม่ ฉันคิดว่าคุณเปลี่ยน FIRST และ FOLLOW
— Vinayak Garg

FIRST (A) เป็น epsilon แน่นอน แต่เนื่องจากคุณต้องการคำนวณชุด FIRST ของสมาชิกที่ถูกต้องทั้งหมด A -> εเพียงแสดงให้เห็นว่าเรามีการผลิตที่ว่างเปล่าและสัญลักษณ์เทอร์มินัลแรกที่คุณเห็น (และชุด FIRST แรก) สัญลักษณ์เทอร์มินัล หวังว่านี่จะช่วยได้!
— อีธาน

0

ค้นหาเงื่อนไขที่เพียงพอซึ่งทำให้ไวยากรณ์ LL (1) (คำใบ้: ดูชุด FIRST)

ค้นหาเงื่อนไขที่ต้องการซึ่งแกรมทั้งหมดของ SLR (1) จะต้องเป็นไปตาม (คำใบ้: ดูชุด FOLLOW)

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