ฉันคิดว่าคำถามมีข้อสันนิษฐานที่ถูกต้องตามแนวเขตแดนเท่านั้น
ในชีวิตจริงมันเป็นเรื่องธรรมดาที่จะอยู่กับแกรมม่าที่คลุมเครือตราบใดที่พวกเขาไม่ได้พูดคลุมเครือเกินไป
ตัวอย่างเช่นหากคุณมองไปที่ไวยากรณ์ที่คอมไพล์ด้วย yacc (หรือคล้ายกันเช่น bison หรือ byacc) คุณจะพบว่ามีคำเตือนเล็กน้อยเกี่ยวกับ "N shift / reduct problems" เมื่อคุณคอมไพล์พวกเขา เมื่อ yacc พบการเปลี่ยนแปลง / ลดความขัดแย้งนั่นเป็นสัญญาณความกำกวมในไวยากรณ์
อย่างไรก็ตามกะ / ลดความขัดแย้งมักเป็นปัญหาเล็กน้อย ตัวแยกวิเคราะห์จะแก้ไขข้อขัดแย้งในความโปรดปรานของ "การเปลี่ยนแปลง" มากกว่าการลด ไวยากรณ์นั้นใช้ได้อย่างสมบูรณ์แบบหากเป็นสิ่งที่คุณต้องการ (และดูเหมือนว่าจะได้ผลในทางปฏิบัติอย่างสมบูรณ์แบบ)
โดยทั่วไปแล้วการเปลี่ยนแปลง / ลดความขัดแย้งเกิดขึ้นในกรณีในคำสั่งทั่วไปนี้ (ใช้ตัวพิมพ์ใหญ่สำหรับที่ไม่ใช่ขั้วและตัวพิมพ์เล็กสำหรับขั้ว):
A -> B | c
B -> a | c
เมื่อเราพบกc
มีความกำกวม: เราควรแยกวิเคราะห์c
โดยตรงในฐานะA
หรือเราควรแยกมันเป็นกB
ซึ่งในทางกลับกันคือA
อะไร? ในกรณีเช่นนี้ yacc และเช่นจะเลือกง่าย / เส้นทางที่สั้นและแยกc
โดยตรงในฐานะที่เป็นA
มากกว่าการไปc
-> B
-> A
เส้นทาง นี้อาจจะผิด แต่ถ้าเป็นเช่นนั้นก็อาจหมายความว่าคุณมีข้อผิดพลาดง่ายจริงๆในโรงเรียนมัธยมของคุณและคุณไม่ควรอนุญาตให้c
ตัวเลือกที่เป็นไปได้สำหรับA
ทุก
ตอนนี้ในทางตรงกันข้ามเราอาจมีบางอย่างที่มากกว่านี้:
A -> B | C
B -> a | c
C -> b | c
ตอนนี้เมื่อเราพบc
ว่าเรามีความขัดแย้งระหว่างว่าจะรักษาc
เป็นหรือB
C
มีโอกาสน้อยกว่าที่กลยุทธ์การแก้ไขข้อขัดแย้งอัตโนมัติจะเลือกสิ่งที่เราต้องการจริงๆ สิ่งเหล่านี้ไม่ใช่ "การเปลี่ยนแปลง" - ทั้งคู่เป็น "การลด" ดังนั้นนี่คือ "การลด / ลดความขัดแย้ง" (ซึ่งผู้ที่คุ้นเคยกับ yacc และโดยทั่วไปรับรู้ว่าเป็นปัญหาที่ใหญ่กว่าการกะ / ลดความขัดแย้ง)
ดังนั้นถึงแม้ว่าฉันไม่แน่ใจว่าฉันจะไปไกลขนาดนั้นเพื่อที่จะบอกว่าใครก็ตามยินดีต้อนรับความคลุมเครือในไวยากรณ์ของพวกเขาอย่างน้อยในบางกรณีมันก็เล็กน้อยพอที่ไม่มีใครสนใจจริง ๆ ในนามธรรมพวกเขาอาจชอบความคิดในการลบความคลุมเครือทั้งหมด - แต่ไม่เพียงพอที่จะทำจริง ตัวอย่างเช่นไวยากรณ์ที่เรียบง่ายขนาดเล็กที่มีความกำกวมเล็กน้อยสามารถเป็นที่ต้องการให้เป็นไวยากรณ์ที่ซับซ้อนและใหญ่กว่าซึ่งจะกำจัดความคลุมเครือ (โดยเฉพาะเมื่อคุณเข้าสู่อาณาจักรจริงของการแยกวิเคราะห์จากไวยากรณ์และพบว่าไม่มีความคลุมเครือ ไวยากรณ์สร้าง parser ที่จะไม่ทำงานบนเครื่องเป้าหมายของคุณ)