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 c
direttamente 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 c
direttamente 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' c
opzione come possibilità per A
tutti.
Ora, al contrario, potremmo avere qualcosa di più simile a questo:
A -> B | C
B -> a | c
C -> b | c
Ora quando incontriamo un c
abbiamo un conflitto tra se trattare c
come un B
o 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).