Creo que la pregunta contiene una suposición que solo es correcta en el mejor de los casos.
En la vida real es bastante común simplemente vivir con gramáticas ambiguas, siempre que no sean (por así decirlo) demasiado ambiguas.
Por ejemplo, si observa las gramáticas compiladas con yacc (o similares, como bison o byacc), encontrará algunas advertencias sobre "conflictos N shift / reduct" cuando las compila. Cuando yacc encuentra un cambio de desplazamiento / reducción, eso indica una ambigüedad en la gramática.
Sin embargo, un conflicto de cambio / reducción suele ser un problema bastante menor. El generador de analizadores resolverá el conflicto a favor del "cambio" en lugar de reducirlo. La gramática está perfectamente bien si eso es lo que quieres (y parece funcionar perfectamente en la práctica).
Un conflicto de desplazamiento / reducción generalmente surge en un caso en este orden general (usando mayúsculas para no terminales y minúsculas para terminales):
A -> B | c
B -> a | c
Cuando encontramos un c
, hay una ambigüedad: ¿deberíamos analizar el c
directamente como un A
, o deberíamos analizarlo como un B
, que a su vez es un A
? En un caso como este, yacc y tal elegirán la ruta más simple / más corta y analizarán c
directamente como una ruta A
, en lugar de ir a la ruta c
-> B
-> A
. Esto puede estar mal, pero si es así, probablemente significa que tiene un error realmente simple en su gramática, y no debe permitir la c
opción como una posibilidad A
.
Ahora, por el contrario, podríamos tener algo más como esto:
A -> B | C
B -> a | c
C -> b | c
Ahora, cuando nos encontramos con un, c
tenemos un conflicto entre si tratarlo c
como a B
o a C
. Hay muchas menos posibilidades de que una estrategia automática de resolución de conflictos elija lo que realmente queremos. Ninguno de estos es un "cambio": ambos son "reducciones", por lo que se trata de un "conflicto de reducción / reducción" (que los que están acostumbrados a YACC y en general reconocen como un problema mucho mayor que un conflicto de cambio / reducción).
Entonces, aunque no estoy seguro de ir tan lejos como para decir que alguien realmente agradece la ambigüedad en su gramática, al menos en algunos casos es lo suficientemente menor como para que a nadie realmente le importe mucho. En resumen, puede que les guste la idea de eliminar toda ambigüedad, pero no lo suficiente como para hacerlo siempre. Por ejemplo, una gramática pequeña y simple que contiene una ambigüedad menor puede ser preferible a una gramática más grande y compleja que elimine la ambigüedad (especialmente cuando entras en el ámbito práctico de generar realmente un analizador sintáctico a partir de la gramática y descubres que no es ambiguo) la gramática produce un analizador que no se ejecutará en su máquina de destino).