Chap5AnalyseSyntaxique MethodesAscendantes 1
Chap5AnalyseSyntaxique MethodesAscendantes 1
Chap5AnalyseSyntaxique MethodesAscendantes 1
METHODES ASCENDANTES
Le modèle général utilisé en analyse ascendante est le modèle par décalage-réduction (shift-reduce) qui
autorise deux opérations :
Exemple
Soit la grammaire G ayant les règles de production suivantes :
S aABe
A Abc| b
Bd
On se propose d’analyser la chaîne abbcde de manière ascendante.
S
abbcde décaler
abbcde réduire
A
aAbcde décaler
aAbcde décaler B
A
aAbcde réduire
a A de décaler
a A de réduire
a A Be décaler a b b c d e
a A Be réduire
S Analyse réussie
Figure 5.1. Arbre syntaxique obtenu de manière
ascendante pour la chaîne abbcde
En résumé, on a donc les réductions suivantes, à partir desquelles on peut déduire, de manière ascendante,
l’arbre syntaxique correspondant à la chaîne abbcde (voir figure 5.1) :
abbcde
aAbcde
a A de
a A Be
S
On constate que la séquence de réductions précédentes correspond, en sens inverse, aux dérivations droites
suivantes : S aABe aAde aAbcde abbcde
Remarque : Il serait intéressant de disposer d’un moyen automatique pour choisir s’il faut effectuer un
décalage ou une réduction et quelle réduction choisir lorsque le pointeur d’entrée se trouve sur une position
donnée.
On distingue trois techniques de construction de tables d’analyse LR pour une grammaire donnée :
Simple LR (SLR) : qui est la plus simple à implémenter, mais la moins puissante des trois.
LR canonique : qui est la plus puissante, mais aussi la plus coûteuse.
LookAhead LR (LALR) : qui a une puissance et un coût intermédiaires entre les deux autres et peut
être appliquée à la majorité des grammaires de langages de programmation.
Action Successeur
Xm
Pile …
S0
Exemples
Remarque
Intuitivement, un item indique la «quantité» de partie droite qui a été reconnue à un instant donné de l’analyse.
Par exemple, l’item AX.YZ indique qu’on vient de voir en entrée une chaîne dérivée de X et qu’on espère
maintenant voir une chaîne dérivée de YZ.
Règle 2 : si A.B Ferm(I) et B est une production de G, alors ajouter B. à Ferm(I), s’il n’y existe
pas déjà. La règle 2 doit être appliquée jusqu’à ne plus pouvoir ajouter de nouveaux items à Ferm(I).
Fonction Ferm(I);
Début
J :=I ;
Répéter
Pour chaque item A.B J et chaque production B telle que B. J
Faire Ajouter B . à J
Jusqu’à ce qu’aucun item ne puisse être ajouté à J ;
Ferm(I) :=J;
Fin ;
Exemple
Soit la grammaire G, ayant les règles de production suivantes :
E E+T | T
T T*F | F
F (E) | id
Soit l’ensemble d’items I= {[E’.E]}. On se propose de calculer Ferm(I). En appliquant les deux règles
précédentes, on trouve : Ferm(I) = { [E’.E], [E.E+T], [E.T], [T.T*F], [T.F], [F.(E)], [F.id] }
5.3.1.4 Fonction Transition
Soit I un ensemble d’items et X un symbole de la grammaire (XVTUVN). Transition (I, X) est définie comme
étant la fermeture de tous les items [AX.] tels que [A.X] I.
Exemple
Procédure CollectionEnsembleItems;
Début
C := {Ferm({[S’.S]})} ;
Répéter
Pour chaque ensemble d’items I de C et pour chaque symbole
de la grammaire X tel que Trans(I, X) soit non vide et non encore dans
C Faire ajouter Trans(I, X) à C
Jusqu’à ce qu’aucun ensemble d’items ne puisse être ajouté à C;
Fin ;
Exemple
On se propose de déterminer la collection canonique d’ensembles d’items de la grammaire augmentée suivante
:
E’E
E E+T | T
T T*F | F
F (E) | id
I0 = Ferm {[E’.E]}
= E’.E
E.E+T
E.T
T.T*F
T.F
F.(E)
F.id
F vers I3
( vers I4
id vers I5
T * F
I2 I7 I10
(
vers I4
id
F vers I5
I3
(
( E )
I4 I8 I11
+
id
vers I6
T
vers I2
F
vers I3
id
I5
Algorithme ConstructionTableSLR;
Début
1/ L’état i est construit à partir de I i. La partie ACTION pour l’état i est déterminée comme suit:
a. Si [A.a] Ii et Trans (Ii, a)= Ij (avec a VT) Alors ACTION [i, a] dj (décaler j)
b. Si [A.] Ii (avec AS’) Alors ACTION [i, a] rnum pour tout a Suiv(A)
(réduire par la régle A dont le numéro est num )
c. Si [S’S.] Ii Alors ACTION [i, $] accepter
2/ La partie SUCCESSEUR pour l’état i est déterminée comme suit :
Si Trans (Ii, A)= Ij Alors SUCCESSEUR [i, A] j
3/ Toutes les entrée restantes dans la table sont mises à ERREUR
4/ L’état initial de l’analyseur est construit à partir de l’ensemble d’items contenant [S’.S]
Fin ;
Exemple
En appliquant l’algorithme ci-dessus, on se propose de construire la table SLR correspondant à la grammaire G
de l’exemple précédent (dont on a déterminé la collection canonique d’ensembles d’items). On obtient la table
SLR suivante :
Exemple
S’S
S G=D
SD
G *D
G id
D G
Détermination de la collection canonique d’ensembles d’items :
I0= Ferm {[S’.S]}
= S’.S
S.G=D
S.D
G.*D
G.id
D.G
I1= Trans (I0, S) = Ferm{[S’S.]}
= S’S.
I2= Trans (I0, G) = Ferm {[SG.=D], [DG.]}
= SG. =D
DG.
I3=Trans (I0, D) = Ferm {[SD.]}
= SD.
I4= Trans(I0, *) =Ferm{[G*.D]}
= G*.D
D.G
G.*D
G.id
I5= Trans(I0, id) = Ferm {[Gid.]}
= Gid.
I6= Trans (I2,=) = Ferm {[SG=.D]}
=SG=.D
D.G
G.*D
G.id
I7= Trans (I4, D) = Ferm {[G*D.]}
= G*D.
I8= Trans (I4,G) = Ferm {[DG.]}
= DG.
I4= Trans (I4,*) = Ferm {[G*.D]}
= G*.D
I5= Trans (I4,id) = Ferm {[Gid.]}
I9= Trans (I6,D) = Ferm {[SG=D.]}
= SG=D.
I8= Trans(I6,G) = Ferm {[DG.]}
= DG.
I4= Trans(I6, *) = Ferm {[G*.D]}
I5= Trans(I6, id) = Ferm {[Gid.]}
= Gid.
Construction de la table d’analyse SLR :
Action Successeur
Etat
= * id $ S G D
0 d4 d5 1 2 3
1 acc
2 d6/r5 r5
3 r2
4 d4 d5 8 7
5 r4 r4
6 d4 d5 8 9
7 r3 r3
8 r5 r5
9 r1
Sachant que :
Suiv(D)= {=, $}
Suiv(G)= {=, $}
Suiv(S)= { $}
Remarque
On constate que Action[2,=] est une case définie de façon multiple. L’état 2 présente un conflit d/r
(déclarer/réduire) ou s/r (shift/reduce) sur le symbole d’entrée « = » donc la grammaire n’est pas SLR (1).
Dans notre cas, la grammaire n’est pas ambiguë mais elle n’est pas SLR(1). D’ailleurs, beaucoup de grammaires
non ambiguës ne sont pas SLR(1). Le conflit shift/réduce (décaler/réduire) dans l’exemple précédent provient
du manque de puissance de la méthode SLR qui ne peut pas « se rappeler » assez de contexte gauche pour
décider de l’action de l’analyseur sur l’entrée « = » après avoir « vu » une chaîne pouvant être réduite vers G.
Les méthodes LR canonique et LALR réussissent pour un nombre plus important de grammaires
que la méthode SLR.
Fonction Ferm(I);
Début
Répéter
Pour chaque item [A.B, a] I, chaque production B G’
et chaque terminal bPrem(a) tel que [B., b] I
Faire Ajouter [B ., b] à I
Jusqu’à ce qu’aucun item ne puisse être ajouté à I;
Ferm(I) := I;
Fin ;
Procédure CollectionEnsembleItems;
Début
C := {Ferm({[S’.S, $]})} ;
Répéter
Pour chaque ensemble d’items I de C et pour chaque symbole
de la grammaire X tel que Trans(I, X) soit non vide et non encore dans
C Faire ajouter Trans(I, X) à C
Jusqu’à ce qu’aucun ensemble d’items ne puisse être ajouté à C;
Fin ;
Algorithme ConstructionTableLR;
Début
1/ L’état i est construit à partir de I i. La partie ACTION pour l’état i est déterminée comme suit: a.
Si [A.a, b] Ii et Trans (Ii, a)= Ij (avec a VT) Alors ACTION [i, a] d j (décaler j)
b. Si [A., a] Ii (avec AS’) Alors ACTION [i, a] rnum
(réduire par la régle A dont le numéro est num )
c. Si [S’S., $] Ii Alors ACTION [i, $] accepter
2/ La partie SUCCESSEUR pour l’état i est déterminée comme suit :
Si Trans (Ii, A)= Ij Alors SUCCESSEUR [i, A] j
3/ Toutes les entrée restantes dans la table sont mises à ERREUR
4/ L’état initial de l’analyseur est construit à partir de l’ensemble d’items contenant [S’.S, $]
Fin ;
Toute grammaire SLR(1) est une grammaire LR(1), mais, pour une grammaire SLR(1), l’analyseur
LR canonique peut avoir un nombre d’états supérieur à l’analyseur SLR pour la même grammaire.
L’idée générale de cet algorithme est de construire les ensembles d’items LR(1) et de fusionner les ensembles
ayant un cœur commun. La table d’analyse LALR(1) est construite à partir de la collection des ensembles
d’items fusionnés. Signalons que cet algorithme est le plus simple, mais il existe d’autres algorithmes plus
efficaces pour la construction de tables LALR(1), qui ne se basent pas sur la méthode LR(1).
Algorithme ConstructionTableLALR;
Début
1/ Construire la collection d’ensembles d’items LR(1) pour la grammaire augmentée G’.
2/ Pour chaque cœur présent parmi les ensembles d’items LR(1), trouver tous les états ayant ce même
cœur et remplacer ces états par leur union.
3/ La table LALR(1) est obtenue en condensant la table LR(1) par superposition des lignes correspondant
aux états regroupés.
Fin ;
Pendant la superposition des lignes, il y a un risque de conflit :
Cas 1 : Conflit décaler/décaler ou shift/shift (d i/dj)
Ce cas de conflit ne peut pas se produire car le décalage se base sur l’élément après le point.
Conclusion: Pendant la superposition des lignes, le seul cas de conflit qui peut se produire est réduire/réduire.
Remarque
S’il n’y a pas de conflit dans la table LALR(1), la grammaire sera considérée LALR(1) ou LALR.
Pour la détermination de la collection d’ensembles d’items LALR(1), on recherche les ensembles d’items LR(1)
pouvant être fusionnés, on en trouve trois paires : I 3 avec I6, I4 avec I 7 et I8 avec I9 qui seront remplacés par
leurs unions respectives :
I36=Cc.C, c/d/$
C.cC, c/d/$
C.d, c/d/$
La construction de la table d’analyse LALR est obtenue par superposition des lignes correspondant aux états
fusionnés:
Action Successeur
Etat
c d $ S C
0 d36 d47 1 2
1 acc
2 d36 d47 5
36 d36 d47 89
47 r3 r3 r3
5 r1
89 r2 r2 r2
Si la chaîne analysée est erronée syntaxiquement (n’appartient pas au langage), l’erreur sera détectée plus
rapidement par l’analyseur LR(1) alors que l’analyseur LALR(1) peut effectuer plusieurs réductions avant de
signaler l’erreur.
Ces deux cas sont illustrés à travers la réponse aux questions 4 et 5 de l’exercice 6.