การลบการเรียกซ้ำซ้ายในไวยากรณ์ขณะที่ยังคงความสัมพันธ์ด้านซ้ายของโอเปอเรเตอร์


13

ฉันมีปัญหากับแบบฝึกหัดนี้:

ให้ G เป็นไวยากรณ์ที่ไม่ชัดเจนต่อไปนี้สำหรับ calcul-แคลคูลัส:

E → v | λv.E | EE | (E)

โดยที่ E คือสัญลักษณ์ที่ไม่ใช่ขั้วเดี่ยวλv.Eแสดงถึงนามธรรม abtraction wrt ตัวแปร v ใน E และ EE แทนแอ็พพลิเคชัน

  1. กำหนดไวยากรณ์LL (1) G ′เช่น L (G′) = L (G) และความคลุมเครือของ G ได้รับการแก้ไขโดยกำหนดอนุสัญญาตามปกติดังต่อไปนี้:
    1. สิ่งที่เป็นนามธรรมคือการเชื่อมโยงที่ถูกต้อง
    2. แอปพลิเคชันนั้นเชื่อมโยงกันอยู่
    3. แอปพลิเคชันมีลำดับความสำคัญสูงกว่านามธรรม
  2. แสดง LL (1) การแยกโต๊ะ G λv1. λv2. v1v2v1และต้นไม้แยกที่ได้รับเมื่อแยกสตริง

ฉันตัดความกำกวมของการตั้งค่าความสำคัญและการเชื่อมโยงเพื่อให้ได้ไวยากรณ์นี้:

E -> EF | F
F -> λv.G | G
G -> (E) | v

ซึ่งไม่ใช่ LL (1) เนื่องจากการผลิตE -> EFซ้ำ อย่างไรก็ตามการกำจัดการเรียกซ้ำซ้ายจากการผลิตที่ฉันได้รับ:

E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v

ที่ไม่เป็นไปตามข้อกำหนด 1.2

ฉันค้นหาวิธีแก้ไขปัญหาบนอินเทอร์เน็ต แต่ดูเหมือนว่ามันเป็นไปไม่ได้ที่จะกำจัดการวนซ้ำทางซ้ายที่สงวนการเชื่อมโยงซ้าย

อย่างไรก็ตามแบบฝึกหัดนี้ปรากฏในการสอบของคอมไพเลอร์เมื่อหลายปีก่อนดังนั้นจะต้องมีคำตอบที่ถูกต้อง

ขอขอบคุณสำหรับความช่วยเหลือของคุณ.

คำตอบ:


11

ความเข้ากันได้ของการเชื่อมโยงด้านซ้ายและการแยกวิเคราะห์ LL (1)

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

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

มีสองวิธีจากนี้ หนึ่งไม่ต้องพึ่งพา parser เพื่อให้ "ต้นไม้แจง" เพื่อใช้สำหรับการประมวลผลในภายหลัง (เช่นลดการแสดงออกแลมบ์ดาที่นี่) สิ่งนี้นำไปสู่แนวคิดของ Abstract Syntax Trees (AST) ที่สามารถสร้างจาก parse-tree แต่มีโครงสร้างที่แตกต่างกัน

อีกวิธีคือการใช้เทคนิคการแยกวิเคราะห์ทั่วไปที่จะยอมรับไวยากรณ์ CF ใด ๆ และแยกวิเคราะห์ตามนั้น parsers CF ทั่วไปเป็นเทคโนโลยีที่พัฒนามาอย่างดี (และฉันไม่หยุดที่จะสงสัยว่าทำไม LL ยังคงได้รับความนิยมมาก)

ฉันไม่รู้เลยว่าอะไรจะถือเป็นคำตอบที่เหมาะสมสำหรับข้อกำหนดที่ขัดแย้งเหล่านี้

สิ่งที่ฉันจะทำคือแสดงว่าพวกเขามีข้อกำหนดที่ขัดแย้งกัน ให้ไวยากรณ์แรกที่ตรงกับความสัมพันธ์และข้อ จำกัด ลำดับความสำคัญจากนั้นแปลงไวยากรณ์เป็นไวยากรณ์ LL และ (1) สำหรับการแยกวิเคราะห์

ความจริงที่ว่าสิ่งที่ปรากฏในวารสารหรือในการสอบไม่ได้รับประกันว่ามันถูกต้องทั้งหมด และฉันอาจจะผิดด้วย ... แต่ฉันได้ทำการตรวจสอบบางอย่างนอกเหนือไปจากความรู้ของตัวเองเกี่ยวกับปัญหา

เกี่ยวกับตัวอย่างเฉพาะนี้

สิ่งนี้ถูกกล่าวว่าไวยากรณ์แรกที่คุณแนะนำดูเหมือนไม่ถูกต้องนัก มันไม่มีวิธีในการผลิตλu.λv.v

เคล็ดลับข้อหนึ่งที่ควรทราบคือเริ่มต้นด้วยตัวดำเนินการ (ที่นี่เป็นนามธรรมหรือแอปพลิเคชัน) โดยมีลำดับความสำคัญต่ำสุด (นามธรรม) มันเหมือนกันสำหรับนิพจน์ทางคณิตศาสตร์


ขอบคุณมากสำหรับความคิดเห็นของคุณอย่างละเอียด คุณพูดถูกฉันทำผิดกับไวยากรณ์แรกแล้วขอบคุณเช่นกัน ฉันจะถามอาจารย์แล้ว
Marco DallaG

ฉันอาจเพิ่มคำตอบโดยมีโน้ตเล็ก ๆ เกี่ยวกับการออกแบบไวยากรณ์สำหรับหุ่น (ฉันด้วย) หากคุณสนใจ บอกสิ่งที่อาจารย์พูดเกี่ยวกับสิ่งนี้
Babou

ฉันจะอัปเดตเธรดเมื่ออาจารย์ตอบคำถามนี้ อย่างไรก็ตามโปรดเพิ่มข้อมูลเพิ่มเติมถ้าไม่ใช่ปัญหาสำหรับคุณแน่นอนฉันขอขอบคุณมาก ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ
Marco DallaG

@MarcoDallaG มาตรงนี้เมื่อทำงานกับ TAPL ของ Pierce อาจารย์ของคุณเคยพูดอะไรที่แตกต่างไปจากคำตอบนี้หรือไม่? :)
lcn

0

ความพยายามของฉัน:

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

ไวยากรณ์นี้เป็น LL (1) และควรเคารพคุณสมบัติที่ต้องการ

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