มีวิธีการแยกความแตกต่างระหว่างไวยากรณ์ LL (k) และ LR (k) หรือไม่?


12

ฉันเพิ่งเรียนเกี่ยวกับคอมไพเลอร์ออกแบบ ฉันได้รู้เกี่ยวกับไวยากรณ์สองประเภทประเภทที่หนึ่งคือ LL ไวยากรณ์และอื่น ๆ คือไวยากรณ์ LR

เรารู้ถึงความจริงที่ว่า LL ไวยากรณ์ทุกตัวเป็น LR ซึ่งก็คือ LL ไวยากรณ์นั้นเป็นเซตย่อยที่เหมาะสมของไวยากรณ์ LR อันแรกใช้ในการแยกวิเคราะห์จากบนลงล่างและอันที่สองใช้ในการแยกวิเคราะห์จากล่างขึ้นบน

แต่มีวิธีใดบ้างที่เราสามารถพูดได้ว่าไวยากรณ์ที่กำหนดคือ LL หรือ LR?


3
วิธีการเกี่ยวกับการใช้เทคนิคบัญญัติเพื่อสร้างตารางและL R ( k )และตรวจสอบว่าพวกเขามีความขัดแย้ง? L L ( 1 )และL R ( 1 )มักจะได้รับการปฏิบัติในตำรามาตรฐานใด ๆ ในการแยกวิเคราะห์; เทคนิคL L ( k )และL R ( k )นั้นหายาก แต่ก็เป็นที่รู้จักกันดี LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Alex ten Brink

@AlextenBrink ฟังดูราวกับว่าคุณจะได้รับคำตอบ! (ยินดีต้อนรับกลับมาคุณพลาด!)
Raphael

การใช้เทคนิคที่ยอมรับได้เพื่อตรวจสอบว่าไวยากรณ์เป็น LL หรือ LR ที่ถูกต้อง แต่เป็นวิธีที่ยาว ฉันพยายามหาวิธีเล็ก ๆ น้อย ๆ ในการค้นหาสิ่งนี้ซึ่งฉันพบในหนังสือ Compilers โดย Aho-Lam-Sethi-Ullman
Deb

คำตอบ:


11

LL(k)LR(k)LL(k)LR(k)และเพราะเราสามารถสร้างตารางสำหรับพวกเขา (แยกวิเคราะห์ตารางจะใช้ในการแยกวิเคราะห์สตริงการป้อนข้อมูล) โปรดทราบว่าสำหรับทั้งสองคลาสนี้การแยกวิเคราะห์ตารางช่วยให้คุณสามารถตรวจสอบว่าแกรมมาร์อยู่ในคลาสได้หรือไม่เพราะนี่คือถ้าหากตารางนั้นไม่มีข้อผิดพลาด นอกจากนี้ใช่มีคลาสของไวยากรณ์ที่เราสามารถแยกวิเคราะห์ได้อย่างมีประสิทธิภาพหากเรามีตารางแยก แต่ที่เราไม่สามารถสร้างตารางหากมันมีอยู่

LL(1)LR(1)SLR(1)LL(k)LR(k)

LL(k)LR(k)LL(1)kLL(k)LR(k)หรือไม่ที่รันในเวลาพหุนาม (การสร้างตารางเป็นเลขชี้กำลัง) สำหรับรายละเอียดโปรดอ่านตำราเรียนด้านบน โปรดทราบว่าในหลายกรณีตารางมีขนาดพอเหมาะดังนั้นจึงไม่จำเป็นต้องทำการทดสอบ

kkLL(k)LR(k)LR(k)kLL(c)ck(ดูรายละเอียดที่นี่ )


คุณทราบหรือไม่ว่าฉันสามารถค้นหารายละเอียดของอัลกอริทึมเวลาพหุนามสำหรับการทดสอบว่าภาษานั้นเป็น LR (k) (นอกเหนือจากการซื้อตำราเรียน) หรือไม่
user541686

2

เราต้องตรวจสอบเพียงว่าไวยากรณ์เป็น LL หรือไม่เพราะทุกไวยากรณ์ LL คือ LR ที่ LL เป็นเซตย่อยที่เหมาะสมของ LR ดังนั้นถ้าไวยากรณ์เป็น LL มันจะต้องเป็น LR แต่ LR ทุกอันไม่ใช่ LL

ไวยากรณ์ G อยู่ใน LL iff เมื่อใดก็ตามที่ A-> C | D ควรมีเงื่อนไขดังต่อไปนี้:

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