Penso che la domanda contenga un'ipotesi che nella migliore delle ipotesi sia solo borderline corretta.
Nella vita reale è abbastanza comune vivere semplicemente con grammatiche ambigue, purché non siano (per così dire) troppo ambigue.
Ad esempio, se ti guardi intorno alle grammatiche compilate con yacc (o simili, come bisonti o byacc) scoprirai che alcuni generano avvertimenti su "N spostamenti / riduci conflitti" quando li compili. Quando yacc incontra uno spostamento / riduzione del conflitto, ciò indica un'ambiguità nella grammatica.
Un conflitto di spostamento / riduzione, tuttavia, è di solito un problema piuttosto lieve. Il generatore di parser risolverà il conflitto a favore dello "spostamento" anziché della riduzione. La grammatica va benissimo se è quello che vuoi (e in pratica sembra funzionare perfettamente).
Un conflitto di spostamento / riduzione si presenta in genere in un caso in questo ordine generale (utilizzando i limiti per i non terminali e le lettere minuscole per i terminali):
A -> B | c
B -> a | c
Quando incontriamo un c, c'è un'ambiguità: dovremmo analizzare il cdirettamente come un A, o dovremmo analizzarlo come un B, che a sua volta è un A? In un caso come questo, yacc e tali sceglieranno il percorso più semplice / breve e analizzeranno cdirettamente il percorso come A, piuttosto che seguire il percorso c-> B-> A. Questo può essere sbagliato, ma in tal caso, probabilmente significa che hai un errore molto semplice nella tua grammatica e non dovresti consentire l' copzione come possibilità per Atutti.
Ora, al contrario, potremmo avere qualcosa di più simile a questo:
A -> B | C
B -> a | c
C -> b | c
Ora quando incontriamo un cabbiamo un conflitto tra se trattare ccome un Bo un C. Ci sono molte meno possibilità che una strategia di risoluzione automatica dei conflitti scelga ciò che vogliamo veramente. Nessuno di questi è uno "spostamento" - entrambi sono "riduzioni", quindi si tratta di un "ridurre / ridurre il conflitto" (che coloro che sono abituati allo yacc e generalmente riconoscono come un problema molto più grande di uno spostamento / riduzione del conflitto).
Quindi, anche se non sono sicuro che sarei arrivato al punto di dire che qualcuno apprezza davvero l' ambiguità nella loro grammatica, in almeno alcuni casi è abbastanza piccolo che nessuno se ne preoccupi davvero tanto. In astratto potrebbe piacere l'idea di rimuovere ogni ambiguità, ma non abbastanza per farlo sempre. Ad esempio, una grammatica piccola e semplice che contiene un'ambiguità minore può essere preferibile a una grammatica più ampia e complessa che elimina l'ambiguità (specialmente quando entri nel regno pratico della generazione effettiva di un parser dalla grammatica e scopri che l'ambiguità la grammatica produce un parser che non verrà eseguito sul computer di destinazione).