มีปัญหาที่แตกต่างกันของ "ห้อยต่องแต่งอย่างอื่น" นอกเหนือจาก "จับคู่ที่ใกล้ที่สุด" หรือไม่?


9

นำเสนอไวยากรณ์ต่อไปนี้บริบทฟรี "ห้อยอื่น" ประเภทความกำกวม (คิดว่าย่อมาและย่อมาและยืนสำหรับบางชนิดอื่น ๆ ของการเรียนการสอนหรือบล็อก): ตัวอย่างเช่นสามารถแยกวิเคราะห์เป็นหรือเป็น (นี่เป็นคำที่ไม่ชัดเจน / สั้นที่สุดสำหรับไวยากรณ์นี้)aif expr thenbelsec

SaSbS|aS|c
aacbc(a(acbc))(a(ac)bc)

วิธี "มาตรฐาน" เพื่อแก้ไขความกำกวม "ห้อย" อื่น ๆ นี้บังคับให้คำสั่ง "else" ( ) จับคู่กับ / ใกล้เคียงที่สุด "if-then" ( ) สิ่งนี้สามารถทำได้ดังนี้: ไวยากรณ์นี้ไม่คลุมเครือ ในตัวอย่างข้างต้นก็บังคับแยกba

SaTbS|aS|cTaTbT|c
(a(acbc))

คำถาม:มีอีกวิธีธรรมชาติในการแก้ปัญหาความคลุมเครือที่จะบังคับแยกของ ? ในคำอื่น ๆ ฉันกำลังมองหาไวยากรณ์ที่สร้างภาษาเดียวกันขณะที่ทั้งสองดังกล่าวข้างต้นที่เป็นที่ชัดเจนและที่จะแยกวิเคราะห์เป็น()(a(ac)bc)aacbcaacbc(a(ac)bc)

หมายเหตุ:ความพยายามครั้งแรกของฉันมีดังนี้: ซึ่งแก้ไขความกำกวมของตามที่ต้องการ - แต่ไวยากรณ์นี้ยังไม่ชัดเจน:สามารถแยกวิเคราะห์เป็นหรือเป็น .

SaSbS|aU|cUaU|c
aacbcaacbacbc(a(ac)b(acbc))(a(acb(ac))bc)

1
และในตัวอย่างสุดท้ายของคุณคุณแยกวิเคราะห์ข้อใดที่เป็นไปได้สองข้อว่าเป็น "ธรรมชาติ" หรือถูกต้องและทำไม?
rici

@rici ใช่นี่เป็นคำถามที่ยุ่งยาก! และฉันไม่รู้ ฉันจะมีความสุขกับไวยากรณ์ที่ชัดเจนซึ่งเป็นผู้ผลิตแยกของทั้งaacbacbcสิ่งที่ผมส่วนใหญ่เกี่ยวกับการดูแลคือ (ที่มีมากขึ้น's กว่า ' s) ตรงกับ -th สุดท้ายกับ -th (และใบสุด's ตรงกัน) aacbacbcaaaaaacbcbcbcabkbkaa
Gro-Tsen

คำตอบ:


7

ปัญหานี้เป็นอะนาล็อกที่แน่นอนของปัญหาการจับคู่วงเล็บในนิพจน์ที่ไม่ได้ปิดวงเล็บบางส่วน นี่คือ "if" (หรือในไวยากรณ์ตัวแทน) เป็นวงเล็บเปิดและ "else" ( ) เป็นวงเล็บปิด (จากลำดับของและ s คุณสามารถแทรกกลไก s โดยการวางหนึ่งก่อนที่แต่ละและเป็นหนึ่งในที่ส่วนท้ายสุด.) เพราะมันเหมาะกับที่ดีขึ้นกับสมองสอดของฉันฉันเขียนเป็น แต่ที่เป็นปัญหาที่อยู่ในมือababcb

ความละเอียดแบบ "จับคู่ที่ใกล้เคียงที่สุด" แบบห้อยใกล้ที่สุดจะจับคู่กับการปิดแต่ละครั้งด้วยการเปิดล่าสุดที่ยังไม่ตรงกัน นั่นหมายความว่าจะไม่มีการเปิดที่ไม่ตรงกัน (หรือปิดสำหรับเรื่องนั้น) ระหว่างการจับคู่แบบเปิดและการจับคู่แบบปิด

ทางเลือกหนึ่งที่เป็นไปได้คือการจับคู่การปิดแต่ละครั้งด้วยการเปิดที่ไม่มีใครเทียบได้เร็ว "ความเป็นไปได้" ที่นี่หมายความว่าการเปิดสามารถจับคู่ได้โดยไม่ละเมิดการทำรังซ้อน (เช่น. ตัวแรกในไม่สามารถจับคู่ครั้งสุดท้ายได้ )(()())

การจับคู่นี้จะต้องทำจากข้างนอกเพื่อไม่ให้มีการพยายามปิดการแข่งขันจนกว่าคู่ทั้งหมดจะถูกจับคู่ ความจริงข้อนี้ทำให้ไม่สามารถแยกวิเคราะห์ด้วยอัลกอริธึม bounded-lookahead เนื่องจากการแยกวิเคราะห์ต้องทำงานภายในจากปลายทั้งสองหลังจากแยกสตริงออกเป็นส่วนที่จับคู่อย่างสมบูรณ์ (เพราะขอบเขต จำกัด การจับคู่ที่มีประสิทธิภาพ)

อย่างไรก็ตามความจริงที่ว่าไม่มี parser จากซ้ายไปขวาออนไลน์ไม่ได้หมายความว่าไม่มี CFG ที่ชัดเจน (ชัดแจ้ง: ภาษา Palindromic จะต้องถูกแยกวิเคราะห์จากปลายทั้งสองไปสู่ตรงกลาง แต่มันง่ายในการเขียนไวยากรณ์ที่ชัดเจน)

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

ดังนั้นนี่คือไวยากรณ์ที่ไม่มั่นคงเล็กน้อย:

SU|MUT|aUbT|aUbc|aMbUMaMbM|cTaT|ac

Sเป็นสัญลักษณ์เริ่มต้น เป็นข้อความที่จับคู่อย่างสมบูรณ์ เป็นมั่นเหมาะงบที่ไม่ตรงกัน (ซึ่งหมายความว่าพวกเขามีอย่างน้อยหนึ่งที่ไม่มีใครเทียบดังนั้นพวกเขาจึงไม่สามารถเป็นที่ว่างเปล่า) และคือ "หาง" ประกอบเพียงเปรียบs ข้อเท็จจริงข้างต้นเกี่ยวกับ open open ที่ไม่ตรงกันนั้นสามารถอ่านได้โดยตรงจากไวยากรณ์: การเปิดที่ไม่ตรงกันทั้งหมดมาจาก ,สามารถปรากฏที่ส่วนท้ายของเท่านั้นและสามารถตามด้วยเท่านั้นMUaTaTTUUT

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

อาจมีวิธีแก้ปัญหาที่ดีกว่าที่ฉันเลือก แต่อันนี้ดูเหมือนจะทำงานได้และมันเล่นได้ดีกับตัวแยกวิเคราะห์ GLR ของ Bison ที่ฉันเคยทดสอบ parser นั้นบ่นเกี่ยวกับ parses ที่คลุมเครือเว้นแต่คุณจะเขียนโค้ดพิเศษเพื่อจัดการกับความคลุมเครือและฉันก็ขี้เกียจเกินกว่าที่จะทำเช่นนั้น ฉันทดสอบด้วยสตริง open + closes ที่มากถึง 20 รายการและดูเหมือนว่าจะมีการแยกวิเคราะห์ที่ไม่คลุมเครือสำหรับทุกลำดับที่ซ้อนกันอย่างถูกต้องโดยไม่สร้าง parses สำหรับลำดับที่ซ้อนกันไม่ถูกต้อง


ขอแสดงความยินดีกับการบรรลุสิ่งที่ฉันสรุปได้อาจเป็นไปไม่ได้! ฉันตรวจสอบการทดลองแล้วว่าสำหรับคำที่มีความยาว≤16ไวยากรณ์นี้ไม่มีความชัดเจนแน่นอนและสร้างคำเดียวกับคำที่ฉันสงสัย ตอนนี้ฉันต้องเข้าใจในรายละเอียดว่ามันทำงานอย่างไร!
Gro-Tsen

@ Gro-Tsen: ฉันหวังว่าวรรคสองจะช่วยอธิบาย ไวยากรณ์นั้นง่ายกว่ามากเมื่อมีความกำกวมแบบ : (ในวิธีแก้ปัญหาของฉัน ) และนั่นคือสิ่งที่ฉันคิดขึ้นมาเมื่อฉันคิดถึงปัญหา ฉันต้องใช้เวลาสักพักในการโน้มน้าวตัวเองว่ามันเป็นสิ่งจำเป็นที่จะทำให้ไม่เป็นโมฆะเพื่อหลีกเลี่ยงการแยกวิเคราะห์ที่คลุมเครือ (แม้ว่าที่ฉันพูดความคลุมเครือนั้นสัมพันธ์กัน) และอีกต่อไป ฉันเลือกที่จะบังคับใช้ ฉันจะเดิมพันว่ามีการนำเสนอที่หรูหรากว่านี้ SaSbT|aMbSMTaT|cU
rici

0

ใช้ a + b + c + d + e และ abcde มีสองวิธีที่ชัดเจนว่าไวยากรณ์สามารถแยกวิเคราะห์สิ่งเหล่านี้ได้อย่างไร แต่มีวิธีหนึ่งที่เราใช้

ในกรณีของ "ห้อยต่องแต่งอย่างอื่น" นั่นไม่ใช่วิธีที่ผู้คนมอง แทนการตีความไวยากรณ์เป็น "if" ตามด้วยศูนย์หนึ่งหรือมากกว่า "else if" ตามด้วยตัวเลือก "else"


โปรดทราบว่า "ถ้า ... แล้ว ... อื่น ๆ ถ้า ... จากนั้น ... ถ้า ... แล้ว ... อีก ... " สอดคล้องกับในสัญกรณ์ของฉัน: นี่คือการแจงโดยไวยากรณ์แรกของฉันอย่างชัดเจน (และตัวแปรที่ฉันให้เห็นด้วย) ดังนั้นฉันจึงไม่ถาม สำหรับการแยกวิเคราะห์ทางเลือกของสิ่งนี้ acbacbacbc
Gro-Tsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.