Je pense que la question contient une hypothèse qui n'est au mieux que limite.
Dans la vraie vie, il est assez courant de simplement vivre avec des grammaires ambiguës, tant qu'elles ne sont pas (pour ainsi dire) trop ambiguës.
Par exemple, si vous examinez les grammaires compilées avec yacc (ou similaire, comme le bison ou le byacc), vous constaterez que plusieurs produisent des avertissements sur les "conflits de décalage / réduction N" lorsque vous les compilez. Quand yacc rencontre un conflit de décalage / réduction, cela signale une ambiguïté dans la grammaire.
Un conflit de changement / réduction, cependant, est généralement un problème assez mineur. Le générateur d'analyseur résoudra le conflit en faveur du «décalage» plutôt que de la réduction. La grammaire est parfaitement bien si c'est ce que vous voulez (et cela semble fonctionner parfaitement bien dans la pratique).
Un conflit de décalage / réduction survient généralement dans un cas de cet ordre général (en utilisant des majuscules pour les non-terminaux et des minuscules pour les terminaux):
A -> B | c
B -> a | c
Lorsque nous rencontrons un c
, il y a une ambiguïté: devons-nous analyser le c
directement comme un A
, ou devons-nous l'analyser comme un B
, qui à son tour est un A
? Dans un cas comme celui-ci, yacc et autres choisiront la route la plus simple / la plus courte, et analyseront c
directement la route en tant que A
, plutôt que de suivre la route c
-> B
-> A
. Cela peut être faux, mais si c'est le cas, cela signifie probablement que vous avez une erreur très simple dans votre grammaire, et vous ne devriez pas du tout autoriser l' c
option comme possibilité A
.
Maintenant, en revanche, nous pourrions avoir quelque chose de plus comme ceci:
A -> B | C
B -> a | c
C -> b | c
Maintenant, lorsque nous rencontrons un, c
nous avons un conflit entre le fait de traiter le c
comme un B
ou un C
. Il y a beaucoup moins de chances qu'une stratégie de résolution automatique des conflits choisisse ce que nous voulons vraiment. Ni l'un ni l'autre n'est un "changement" - les deux sont des "réductions", c'est donc un "réduire / réduire le conflit" (que ceux qui sont habitués au yacc et autres reconnaissent généralement comme un problème beaucoup plus important qu'un conflit de décalage / réduction).
Donc, même si je ne suis pas sûr, j'irais jusqu'à dire que quiconque accueille vraiment l' ambiguïté dans sa grammaire, dans au moins certains cas, c'est suffisamment mineur pour que personne ne s'en soucie vraiment. Dans l'abstrait, ils pourraient aimer l'idée de lever toute ambiguïté - mais pas assez pour toujours le faire. Par exemple, une petite grammaire simple qui contient une ambiguïté mineure peut être préférable à une grammaire plus grande et plus complexe qui élimine l'ambiguïté (surtout lorsque vous entrez dans le domaine pratique de la génération effective d'un analyseur syntaxique à partir de la grammaire et que la grammaire produit un analyseur qui ne fonctionnera pas sur votre machine cible).