Я думаю, что вопрос содержит предположение, которое в лучшем случае является только правильным.
В реальной жизни довольно часто просто жить с неоднозначными грамматиками, если они не являются (так сказать) слишком двусмысленными.
Например, если вы посмотрите на грамматики, скомпилированные с помощью yacc (или аналогичные, такие как bison или byacc), вы обнаружите, что довольно многие выдают предупреждения о «N сдвигах / сокращениях конфликтов» при их компиляции. Когда yacc сталкивается с конфликтом сдвига / уменьшения, это говорит о неоднозначности в грамматике.
Однако конфликт сдвига / уменьшения обычно является довольно незначительной проблемой. Генератор парсера разрешит конфликт в пользу «сдвига», а не уменьшения. Грамматика отлично подходит, если это то, что вы хотите (и, похоже, на практике она работает очень хорошо).
Конфликт сдвига / уменьшения обычно возникает в случае этого общего порядка (с использованием заглавных букв для нетерминалов и строчных букв для терминалов):
A -> B | c
B -> a | c
Когда мы сталкиваемся с a c
, возникает двусмысленность: следует ли нам анализировать c
непосредственно как A
, или мы должны анализировать как a B
, что, в свою очередь, является A
? В таком случае yacc и другие выберут более простой / короткий маршрут и проанализируют его как c
прямой A
, а не как маршрут c
-> B
-> A
. Это может быть неправильно, но если это так, это, вероятно, означает, что у вас действительно простая ошибка в вашей грамматике, и вы вообще не должны допускать эту c
опцию как возможность A
.
Теперь, напротив, мы могли бы иметь что-то более похожее на это:
A -> B | C
B -> a | c
C -> b | c
Теперь, когда мы сталкиваемся с, c
у нас возникает конфликт между тем, рассматривать ли c
как a B
или a C
. Вероятность того, что стратегия автоматического разрешения конфликтов выберет то, чего мы действительно хотим, гораздо меньше. Ни один из них не является «сдвигом» - оба являются «сокращением», так что это «конфликт уменьшения / уменьшения» (который привыкли считать yacc и тому подобное, как правило, гораздо более серьезной проблемой, чем конфликт сдвига / уменьшения).
Итак, хотя я не уверен, что зашел бы так далеко, чтобы сказать, что кто-то действительно приветствует двусмысленность в своей грамматике, по крайней мере, в некоторых случаях она настолько незначительна, что никому на самом деле не все равно. В реферате им может понравиться идея убрать всю двусмысленность, но этого недостаточно, чтобы всегда это делать. Например, небольшая, простая грамматика, которая содержит небольшую неоднозначность, может быть предпочтительнее, чем большая, более сложная грамматика, которая устраняет неоднозначность (особенно, когда вы попадаете в практическую область фактического создания синтаксического анализатора из грамматики, и обнаруживаете, что однозначный грамматика создает парсер, который не будет работать на вашей целевой машине).