ปัญหานี้เป็นอะนาล็อกที่แน่นอนของปัญหาการจับคู่วงเล็บในนิพจน์ที่ไม่ได้ปิดวงเล็บบางส่วน นี่คือ "if" (หรือในไวยากรณ์ตัวแทน) เป็นวงเล็บเปิดและ "else" ( ) เป็นวงเล็บปิด (จากลำดับของและ s คุณสามารถแทรกกลไก s โดยการวางหนึ่งก่อนที่แต่ละและเป็นหนึ่งในที่ส่วนท้ายสุด.) เพราะมันเหมาะกับที่ดีขึ้นกับสมองสอดของฉันฉันเขียนเป็น แต่ที่เป็นปัญหาที่อยู่ในมือababcb
ความละเอียดแบบ "จับคู่ที่ใกล้เคียงที่สุด" แบบห้อยใกล้ที่สุดจะจับคู่กับการปิดแต่ละครั้งด้วยการเปิดล่าสุดที่ยังไม่ตรงกัน นั่นหมายความว่าจะไม่มีการเปิดที่ไม่ตรงกัน (หรือปิดสำหรับเรื่องนั้น) ระหว่างการจับคู่แบบเปิดและการจับคู่แบบปิด
ทางเลือกหนึ่งที่เป็นไปได้คือการจับคู่การปิดแต่ละครั้งด้วยการเปิดที่ไม่มีใครเทียบได้เร็ว "ความเป็นไปได้" ที่นี่หมายความว่าการเปิดสามารถจับคู่ได้โดยไม่ละเมิดการทำรังซ้อน (เช่น. ตัวแรกในไม่สามารถจับคู่ครั้งสุดท้ายได้ )(()())
การจับคู่นี้จะต้องทำจากข้างนอกเพื่อไม่ให้มีการพยายามปิดการแข่งขันจนกว่าคู่ทั้งหมดจะถูกจับคู่ ความจริงข้อนี้ทำให้ไม่สามารถแยกวิเคราะห์ด้วยอัลกอริธึม bounded-lookahead เนื่องจากการแยกวิเคราะห์ต้องทำงานภายในจากปลายทั้งสองหลังจากแยกสตริงออกเป็นส่วนที่จับคู่อย่างสมบูรณ์ (เพราะขอบเขต จำกัด การจับคู่ที่มีประสิทธิภาพ)
อย่างไรก็ตามความจริงที่ว่าไม่มี parser จากซ้ายไปขวาออนไลน์ไม่ได้หมายความว่าไม่มี CFG ที่ชัดเจน (ชัดแจ้ง: ภาษา Palindromic จะต้องถูกแยกวิเคราะห์จากปลายทั้งสองไปสู่ตรงกลาง แต่มันง่ายในการเขียนไวยากรณ์ที่ชัดเจน)
ในการสร้างไวยากรณ์สำหรับปัญหาวงเล็บ "ไกลที่สุด" ฉันอาศัยความจริงที่ว่าการเปิดที่ไม่มีใครเทียบไม่สามารถตามด้วยการเปิดที่ตรงกัน ถ้าเป็นเช่นนั้นแล้วคุณสมบัติการจับคู่ที่ไกลที่สุดจะไม่นำมาใช้เนื่องจากการเปิดที่ไม่มีใครเทียบอาจทำให้การจับคู่ของการเปิดนั้นตรงกับความจริง
ดังนั้นนี่คือไวยากรณ์ที่ไม่มั่นคงเล็กน้อย:
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|ac
Sเป็นสัญลักษณ์เริ่มต้น เป็นข้อความที่จับคู่อย่างสมบูรณ์ เป็นมั่นเหมาะงบที่ไม่ตรงกัน (ซึ่งหมายความว่าพวกเขามีอย่างน้อยหนึ่งที่ไม่มีใครเทียบดังนั้นพวกเขาจึงไม่สามารถเป็นที่ว่างเปล่า) และคือ "หาง" ประกอบเพียงเปรียบs ข้อเท็จจริงข้างต้นเกี่ยวกับ open open ที่ไม่ตรงกันนั้นสามารถอ่านได้โดยตรงจากไวยากรณ์: การเปิดที่ไม่ตรงกันทั้งหมดมาจาก ,สามารถปรากฏที่ส่วนท้ายของเท่านั้นและสามารถตามด้วยเท่านั้นMUaTaTTUUT
clunkiness มาจากการป้องกันจากการจับคู่สตริงว่าง ที่ป้องกันไม่ให้พวงของสิ่งที่ฉันพิจารณาความคลุมเครือปลอม: พวกเขาเก๊ในแง่ที่ว่าการจับคู่ของการเปิดและปิดเป็นเหมือนกันในการแยกวิเคราะห์ทางเลือกทั้งหมด หากอนุญาตให้เป็นโมฆะมันจะได้รับสตริงที่สมดุลอย่างสมบูรณ์ ตั้งแต่เป็นผลที่จะนำไปสู่ความคลุมเครือในที่ที่คุณสามารถพิจารณาสมบูรณ์สมดุลจะเป็นชุดของตามด้วยที่ว่างเปล่าหรือหนึ่งน้อยตามด้วยความสมดุลอย่างสมบูรณ์UUUSM∗USMUMU
อาจมีวิธีแก้ปัญหาที่ดีกว่าที่ฉันเลือก แต่อันนี้ดูเหมือนจะทำงานได้และมันเล่นได้ดีกับตัวแยกวิเคราะห์ GLR ของ Bison ที่ฉันเคยทดสอบ parser นั้นบ่นเกี่ยวกับ parses ที่คลุมเครือเว้นแต่คุณจะเขียนโค้ดพิเศษเพื่อจัดการกับความคลุมเครือและฉันก็ขี้เกียจเกินกว่าที่จะทำเช่นนั้น ฉันทดสอบด้วยสตริง open + closes ที่มากถึง 20 รายการและดูเหมือนว่าจะมีการแยกวิเคราะห์ที่ไม่คลุมเครือสำหรับทุกลำดับที่ซ้อนกันอย่างถูกต้องโดยไม่สร้าง parses สำหรับลำดับที่ซ้อนกันไม่ถูกต้อง