TD3 : Transformation de grammaires
Timothée Bernard (timothee.bernard@ens-lyon.org)
5 octobre 2016
1. Soit la grammaire suivante : SaSbS |bSaS |ε.
(a) Donner l’algorithme permettant de rendre ε-libre une grammaire algébrique quelconque.
Solution:
1. On construit A={AV/A +
ε}.
2. On supprime toutes les règles Aε.
3. Pour toute règle Bα0A0α1A1...αnoù les Aiappartiennent à l’ensemble A, on
remplace la règle par toutes les règles Bα0A0
0α1A0
1...αn
A0
iest soit Aisoit ε(on prend successivement toutes les combinaisons).
4. Si S∈ A, ajouter S0dans V, et S0S|εdans P, et remplacer l’axiome Spar
S0.
(b) Appliquer l’algorithme à la grammaire donnée ci-dessus.
Solution: S0S|ε
SaSbS |bSaS |ab |ba |aSb |abS |bSa |baS
2. Transformer la grammaire suivante en grammaire sans règles singulières :
SAB |A;AaB |bA |aSb ;BS|b
Solution: SAB |aB |bA |aSb ;AaB |bA |aSb ;BAB |aB |bA |aSb |b
3. Transformer en forme normale de Greibach la grammaire suivante (qui est déjà non récursive
gauche) : SAa |b
AbdC |cC
CcC |adC |c|ad
Solution: La grammaire de départ est déjà non récursive gauche. On obtient l’ordre partiel
S < A. Arbitrairement on le rend total par exemple avec S<A<C .
La règle SAa est changée en SbdCa|cCa La suite est triviale : il ne reste plus de règles
dont la partie droite commence par un non terminal. Les terminaux en position non initiale de
partie droite sont changés en non terminaux équivalents (i.e. produisant le terminal équivalent
seul : Ww).
1SbDCA0|cCA0|b
Dd
A0a
2AbDC |cC
3CcC |aDC |c|aD
1
4. Enlever la récursivité gauche de la grammaire suivante :
EEa |b
Solution: EbE0
E0aE0|ε
5. Appliquer l’algorithme de dé-récursivation (gauche) vu en cours à la grammaire suivante (gram-
maire de la liste) :
S(L)|a
LL, S |S
Solution: S(L)|a
LSL0
L0, SL0|ε
6. Implémentation en Python de l’algorithme de dé-récursivisation, à partir du canevas disponible
sur la page de Pascal Amsili.
7. Mettre sous forme normale de Chomsky la grammaire définie par les règles de production suivantes :
SAB |aS |a
AAb |ε
BAS
Solution: Il faut commencer par rendre la grammaire ε-libre, ce qui est assez simple dans ce
cas particulier, puisque seul Aest susceptible de s’effacer :
SAB |aS |a
AAb |ε
BAS
S0S|ε
SAB |(ε)B|aS |a
AAb |(ε)b
BAS |(ε)S
S0S|ε
SAB |B|aS |a
AAb |b
BAS |S
Il faut ensuite débarrasser la grammaire des productions singulières, qui sont exclues dans une
grammaire quadratique.
L’algorithme général est le suivant :
1. Partir d’une grammaire ε-libre.
2. Pour tout AV, construire NA={BV / A
B}
3. Soit Pl’ensemble initial de règles ; on construit P0le nouvel ensemble de productions
de la manière suivante :
(a) Ajouter dans P0toutes les règles non singulières de P.
(b) Pour toute règle Bαde P0(non singulière par hypothèse),
pour tout AVtel que BNA, ajouter AαàP0.
L’application systématique de l’algorithme à notre grammaire donne :
S0S|ε
SAB |aS |a
AAb |b
BAS
NS={B, S}
NA=
NB={B, S}
SAB non sing. ; et SNBdonc on ajoute BAB
SaS non sing. ; et SNBdonc on ajoute BaS
Sanon sing. ; et SNBdonc on ajoute Ba
BAS non sing. ; et BNSdonc on ajoute SAS
Cela donne la grammaire suivante, qu’il est alors simple de rendre quadratique :
S0S|ε
SAS |AB |aS |a
AAb |b
BAS |AB |aS |a
S0S|ε
SAS |AB |XS|a
Xa
AAY|b
Yb
BAS |AB |XS|a
Page 2
Il y a deux cycles imbriqués dans la grammaire ε-libre (S
B
S), ce qui explique qu’in
fine Set Bengendrent le même langage. Cela suggère une simplication de la grammaire, mais
ce n’était pas demandé ici.
À propos de la simplication : dans le cas particulier de cette grammaire, il aurait été possible
de se contenter de la grammaire :
S0S|ε
SAS |AB |aS |a
AAb |b
BAS
... mais cela tient au fait que Bn’est atteint que par S, dans la règle
AAB, et que par conséquent tout ce qu’on perd en supprimant
la dérivation BSest « rattrapé » par la dérivation SAS.
8. Soit le langage L1sur le vocabulaire V= {l’,homme,ours,qui,a,vu} formé de l’ensemble des
phrases finies de la forme l’homme qui a vu l’ours,l’homme qui a vu l’homme qui a vu l’ours,
l’homme qui a vu l’homme qui a vu . . . qui a vu l’ours.
Donner une grammaire algébrique (context-free) engendrant L1.
9. Proposer une grammaire en forme de Greibach équivalente à la grammaire suivante :
SaSB |BA
ASbc |Ac
BbSB |b
Solution: SaSB |BA
ASbc |Ac
BbSB |b
Pas d’ε-production, pas de récursivité indirecte, pas de productions singulère. Il faut juste
traiter la récursivité directe de A(soit on utilise la version de dé-récursivation sans ε, soit on
dé-ε-ise après coup). Cela donne :
SaSB |BA
ASbc |SbcA0
A0cA0|c
BbSB |b
Résultat final :
Xbb
Xcc
SaSB |bSBA |bA
AaSBXbXc|bSBAXbXc|bXbXc|aSBXbXcA0|bSBAXbXcA0|bXbXcA0
A0cA0|c
BbSB |b
Page 3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !