web-dev-qa-db-fra.com

Conversion d'une grammaire ambiguë en univoque

Je n'ai pas compris comment une grammaire non ambiguë dérive d'une grammaire ambiguë? Considérez l'exemple sur site: Exemple . Comment la grammaire a-t-elle été dérivée me déroute.

Quelqu'un peut-il me guider?

23
name_masked

L'exemple a deux grammaires:

Ambigu:

E → E + E | E ∗ E | (E) | a

Non ambigu:

E → E + T | T
T → T ∗ F | F
F → (E) | a

La grammaire non ambiguë a été dérivée de la grammaire ambiguë en utilisant des informations non spécifiées dans la grammaire ambiguë:

  • L'opérateur '*' se lie plus étroitement que l'opérateur '+'.
  • Les opérateurs '*' et '+' sont tous deux associatifs.

Sans les informations externes, il n'y a aucun moyen de faire la transformation.

Avec les informations externes, nous pouvons dire que:

a * a + b * b

est groupé comme s'il était écrit:

(a * a) + (b * b)

plutôt que comme:

a * ((a + b) * b)

La seconde suppose que "+" se lie plus étroitement que "*" et que les opérateurs se lient de droite à gauche plutôt que de gauche à droite.


Commentaire

Comment l'associativité entrerait-elle en scène pour des exemples comme:

    S → aA | Ba
    A → BA | a
    B → aB | epsilon

Il s'agit d'une grammaire ambiguë, alors comment procéder pour la convertir en univoque?

Je me demande si le 'epsilon' est ε, la chaîne vide; analysons la grammaire dans les deux sens.

ε est la chaîne vide

La règle pour B dit qu'un B est soit une chaîne vide ou un a suivi d'un B valide, ce qui équivaut à une chaîne indéfiniment longue de 0 ou plusieurs a.

La règle pour A dit qu'un A est un a ou un B suivi d'un a. Ainsi, une chaîne indéfiniment longue de a pourrait aussi être un A. Donc, il n'y a aucun moyen pour la grammaire de choisir si une chaîne de a est soit A soit B.

Et la règle pour S n'est d'aucune aide; un S est soit un a suivi d'une chaîne indéfiniment longue de a soit une chaîne indéfiniment longue de a suivie d'un a. Il nécessite au moins un a, mais n'importe quel nombre de un à partir de un est OK, mais la grammaire n'a aucune base pour décider entre les alternatives gauche et droite.

Ainsi, cette grammaire est intrinsèquement ambiguë et ne peut, à mon avis, être rendue sans ambiguïté; il ne peut certainement pas être rendu sans ambiguïté sans d'autres informations qui ne sont pas en notre possession.

ε n'est pas la chaîne vide

Et si ε n'est pas la chaîne vide?

  • B est soit ε soit an aε.
  • A est soit un a ou un B suivi d'un a (donc soit un a ou un aε ou un aaε).
  • Soit: S est un a suivi d'un A (d'où aa, aaε ou aaaε)
  • Ou: S est un B suivi d'un a (d'où εa ou aεa).

Dans ce cas, la grammaire est sans ambiguïté en l'état (mais pas nécessairement LR (1)). De toute évidence, beaucoup dépend de la signification de "epsilon" dans le commentaire/la question.

Associativité

Je ne pense pas que l'associativité affecte cette grammaire. Il entre généralement en jeu avec les opérateurs infixes (comme le "+" dans "a + b").

47
Jonathan Leffler

De Wikipedia (sur Reconnaître les grammaires ambiguës ):

Certaines grammaires ambiguës peuvent être converties en grammaires non ambiguës, mais aucune procédure générale pour ce faire n'est possible, tout comme aucun algorithme n'existe pour détecter les grammaires ambiguës.

Pour arriver à la deuxième grammaire, vous devez trouver une grammaire qui est

  1. Équivalent au premier: les deux génèrent le même langage
  2. Sans ambiguïté: pour chaque phrase de la langue, l'arbre d'analyse est unique
10
Dave O.