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


12

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

SAaA|BBa
Aε
Bε

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

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

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


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

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

คำตอบ:


11

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

1 SAaAb
2 SBbBa
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) หุ่นยนต์

0SAaASBBaABA1B5
1 รัฐSAaAa2
รัฐ 2SAaAAA3
รัฐ 3SAaA4
รัฐ 4SAaA
รัฐ 5SBBa6
รัฐ 6SBBaBB7
รัฐ 7SBBaa8
8 รัฐSBBa

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

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

  1. เรามี FIRST(AaA)FIRST(BBa)= ตั้งแต่ FIRST(AaA)={a} ในขณะที่ FIRST(BBa)={} และพวกเขาไม่มีองค์ประกอบทั่วไป
  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.