Universit´e Paris 7 – LI324 – 05/06 Ch2. Langages alg´ebriques
2.2.3 ecursivit´e gauche
Un symbole non terminal Ad’une grammaire est dit ecursif si A
αAβ avec α, β
(XV). Si α=ε,Aest dit ecursif (`a) gauche. Une grammaire comportant au moins
un symbole non terminal r´ecursif gauche est dite r´ecursive gauche. (Idem droite).
La r´ecursivit´e gauche pose divers probl`emes en analyse, et dans l’application de certains
algorithmes de transformation de grammaire. C’est la raison pour laquelle on cherche `a
´eliminer cette r´ecursivit´e, ce qui est toujours possible, car on dispose d’un th´eor`eme :
Tout langage alg´ebrique peut ˆetre g´en´er´e par une grammaire alg´ebrique non
r´ecursive gauche
La d´emonstration de ce th´eor`eme, comme souvent en pareil cas, repose sur un algorithme
qui, ´etant donn´ee une grammaire alg´ebrique ecursive gauche, produit une grammaire
alg´ebrique non r´ecursive gauche qui reconnaˆıt le mˆeme langage.
Il faut proc´eder en deux temps : d’une part, on va ´eliminer la ecursivit´e directe
(ou imm´ediate), puis ´eliminer la ecursivit´e indirecte. On pr´esente ici l’algorithme en
commen¸cant par un cas simple, qu’on g´en´eralise avant d’´eliminer finalement toutes les
r´ecursivit´es.
R`egle simple Au niveau d’une r`egle, cela peut se faire simplement :
A|β, (avec β6=Au), devient : AβA
AαA|ε
La r`egle Apermet de g´en´erer un nombre quel-
conque de chaˆıne(s) α, mais pour que la d´erivation
soit effectivement productive, il est n´ecessaire que la
r´ecursion s’arrˆete, c’est-`a-dire que Adonne β.
On charge alors une r`egle de commencer par ce β, et
ensuite on a une r`egle r´ecursive (mais pas gauche),
pour engendrer autant de fois que n´ecessaire les α.
A
H
H
A
H
H
A
β
α
α
A
H
H
β A
H
H
α A
H
H
αA
ε
Bien entendu, on produit un arbre syntaxique diff´erent dans les deux cas.
G´en´eralisation Pour chaque non terminal r´ecursif, on propose :
A1|2|...|m|β1|... |βkdevient (Aβ1A|β2A|... |βkA
Aα1A|α2A|... |αmA|ε
Exemple EE+T|T
TTF|F
F(E)|a
se trouve transform´e en ET E
E+T E|ε
TF T
T→ ∗F T |ε
F(E)|a
Appliqu´e `a chaque non terminal r´ecursif, cet algorithme supprime les sources de r´ecursivit´e
8
Universit´e Paris 7 – LI324 – 05/06 Ch2. Langages alg´ebriques
gauche directes. Mais, comme on peut le voir avec l’exemple suivant, il y a potentiellement
dans les grammaires des sources de r´ecursivit´e indirectes, qu’il faudra ´eliminer aussi.
SAa |b
AAc |Sd |c
qui devient SAa |bR`egle conserv´ee
ASdA|cAR`egle transform´ee
AcA|ε
La r´ecursivit´e directe de la r`egle Aest supprim´ee, mais on n’a pas ´elimin´e la
r´ecursivit´e indirecte ASγ γ.
´
Elimination de la r´ecursivit´e indirecte
Id´ee de l’algorithme : pour les paires de r`egles du type AAδet A, on «anticipe »
les d´erivations probl´ematiques : Aδ, et on applique l’algorithme pr´ec´edent.
Suppression de toutes les r´ecursivit´es
Donn´ees Ggrammaire alg´ebrique propre
R´esultat Ggrammaire sans r´ecursivit´e `a gauche, t.q. LG=LG.
M´ethode Soit (A1, A2, ...An) la liste ordonn´ee des AiV.
Pour tout ide 1 `a nfaire {
Pour tout jde 1 `a i1 faire {
Si AiAjαexiste, la remplacer par : Aiδ1α|δ2α|...|δhα
o`u Ajδ1|δ2|...|δh
}
´
Eliminer la r´ecursivit´e imm´ediate des Ai-productions
}
Exemple : grammaire pr´ec´edente SAa |b
AAc |Sd |c
Ordre des non-terminaux (arbitraire) : {A1=S, A2=A}
i= 1 :
i= 2 ; j= 1 :
La r`egle ASd est concern´ee (Ai(=2) Aj(=1)α)
On la remplace par AAad |bd
On «er´ecursive »toutes les A(i)-productions :
Les r`egles AAad |Ac |c|bd deviennent (AcA|bdA
AadA|cA|ε
– Fin
La grammaire r´esultante est
SAa |b
AcA|bdA
AadA|cA|ε
ou
SAa |b
AcA|bdA|c|bd
AadA|cA|ad |c
Exercice Appliquer le eme algorithme `a la grammaire suivante, grammaire de la liste.
S(L)|a
LL, S |S
9
1 / 2 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 !