Я думаю, що питання містить припущення, яке в кращому випадку є правильним лише на кордоні.
У реальному житті досить часто просто жити з неоднозначними граматиками, якщо вони не є (так би мовити) надто неоднозначними.
Наприклад, якщо ви подивитеся на граматики, складені з yacc (або подібними, такими як зубр або byacc), ви побачите, що при їх компілюванні досить багато створюють попередження про "N конфліктів зміщення / зменшення". Коли yacc стикається зі зміною / зменшенням конфлікту, це сигналізує про неоднозначність у граматиці.
Однак конфлікт із зміною / зменшенням, як правило, є досить незначною проблемою. Генератор аналізатора вирішить конфлікт на користь "зрушення", а не зменшення. Граматика цілком чудова, якщо це те, що ти хочеш (і, здається, на практиці це виходить ідеально).
Конфлікт "зсув / зменшення" зазвичай виникає у випадку в цьому загальному порядку (використовуючи обмеження для нетерміналів та малі регістри для терміналів):
A -> B | c
B -> a | c
Коли ми стикаємося з a c
, виникає неоднозначність: чи слід розбирати c
безпосередньо як an A
, чи слід розбирати його як 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, і таких, як правило, визнають набагато більшою проблемою, ніж конфлікт зміни / зменшення).
Тож, хоча я не впевнений, я б зайшов досить далеко, щоб сказати, що хтось дійсно вітає двозначність у своїй граматиці, принаймні в деяких випадках вона є досить незначною, що нікого насправді багато не цікавить. У рефераті їм може сподобатися ідея усунути всю неоднозначність, але недостатньо, щоб завжди насправді це робити. Наприклад, невелика, проста граматика, яка містить незначну неоднозначність, може бути кращою перед більшою, більш складною граматикою, яка виключає неоднозначність (особливо, коли ви потрапляєте в практичну сферу фактичного генерування парсера з граматики, і виявляєте, що це однозначно граматика виробляє аналізатор, який не працюватиме на вашій цільовій машині).