Analyse Syntaxique
Analyse Syntaxique
Chapitre 6
1. Rôle d’un analyseur syntaxique
A → β1 A′ |β2 A′ | . . . |βm A′
A′ → α1 A′ |α2 A′ | . . . |αn A′ |ε
Élimination de la récursivité à gauche
Exemple
La grammaire dont les règles de production sont les suivantes est
récursive à gauche
Exp → Exp op Exp|(Exp)|id|nb
Grammaire ambiguë
Admet des règles de la forme : A → αβ1 |αβ2
Exemple
I → If (Expression) Then I S
S → ε|else I
2. Analyse descendante
Suivant :
Pour tout non-terminal A, on cherche SUIVANT(A) : l’ensemble de
tous les symboles terminaux a qui peuvent apparaître
immédiatement à droite de A dans une dérivation : S→ αAaβ
Calcul des premiers et suivants
Calcul des premiers
Appliquer les règles suivantes jusqu’à ce qu’aucun terminal ni ε ne
puisse être ajouté aux ensembles PREMIER :
1 Si X est un terminal, PREMIER(X) est {X}.
2 Si X → ε est une production, ajouter ε à PREMIER(X).
3 Si X est un non-terminal et X → Y1 Y2 . . . Yk une production,
mettre a dans PREMIER(X) s’il existe i tel que a est dans PREMIER(Yi )
et que ε est dans tous les PREMIER(Y1 ), . . ., PREMIER(Yi−1 ) c.a.d Y1
,. . .,Yi−1 ⇒* ε. Si Y1 ne dérive pas en ε,
on n’ajoute rien de plus à PREMIER(X), mais si Y1 ⇒ *ε, on ajoute
PREMIER(Y2 ), etc.
2. Analyse descendante
Algorithme de construction des ensembles PREMIER :
Exemple
S → AB | Da
A → aAb | ε
B → bB | ε
D → dD | e
ε-production { A, B, S}
Premier (S) = ? { a,b,d,e}
Premier (A) = ? {a,ε}
Premier (B) = ? {b,ε}
Premier (D) = ? {d,e}
Exemple suite
Exemple
E →TE’
E’→+TE’|-TE’|ε
T →FT’
T’→*FT’|/FT’|ε
PREMIER(E) = PREMIER(T )= PREMIER(F) = {(,nb}
F →(E)|nb PREMIER(E’) = {+,-,ε}
PREMIER(T) = PREMIER(F ) = {(,nb}
PREMIER(T’) = {*,/,ε}
PREMIER(F) = {(, nb}
2. Analyse descendante
Autre Exemple
2. Analyse descendante
SUIVANT(E) = {$,)}
SUIVANT(E’) = SUIVANT(E) = {$,)}
SUIVANT(T) = PREMIER(E’) U SUIVANT(E)
(cas E’ = ε) = {+,-, $,)}
SUIVANT(T’) = SUIVANT(T) = {+,-, $,)}
SUIVANT(F) = PREMIER(T’) U SUIVANT(T) (cas T’ =ε) = {*,/,+,-,$,)}
2. Analyse descendante
E → TE’
E’→ +TE’ | −TE’| ε
T → FT’
T’→ ∗FT’ | /FT’| ε
F → (E) | nb
La construction de la table d’analyse du grammaire G revient à
l’application des 3 étapes suivantes :
2. Analyse descendante
●
1. Calcul du PREMIER
PREMIER(E) = {(,nb}
PREMIER(E’) = {+,-,ε}
PREMIER(T) = {(,nb}
PREMIER(T’) = {*,/,ε}
PREMIER(F) = {(, nb}
●
2. Calcul du SUIVANT
SUIVANT(E) = {$,)}
SUIVANT(E’) = {$,)}
SUIVANT(T) = {+,-, $,)}
SUIVANT(T’) = {+,-, $,)}
SUIVANT(F) = {*,/,+,-,$,)}
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E
E’
T
T’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’
E’
T
T’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’
T
T’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE
T
T’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE E’→ε E’→ε
T
T’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE E’→ε E’→ε
T T→FT’ T→FT’
T’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE E’→ε E’→ε
T T→FT’ T→FT’
T’ T’→*FT’ T’→/FT’
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE E’→ε E’→ε
T T→FT’ T→FT’
T’ T’→ε T’→ε T’→*FT’ T→/FT’ T’→ε T’→ε
F
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE E’→ε E’→ε
T T→FT’ T→FT’
T’ T’→ε T’→ε T’→*FT’ T→/FT’ T’→ε T’→ε
F F→nb
2. Analyse descendante
3. Construction de la table d’analyse
nb + - * / ( ) $
E E→TE’ E→TE’
E’ E’→+TE E’→-TE E’→ε E’→ε
T T→FT’ T→FT’
T’ T’→ε T’→ε T’→*FT’ T→/FT’ T’→ε T’→ε
F F→nb F→(E)
2. Analyse descendante
●
Analyse Syntaxique
soit p= { S→ aAb , A→ cd |c }
Nous avons Premier (S)= {a} , Premier (A)= {c} , Suivant (S)= {$} ,
Suivant (A)= {b} , ce qui donne la table d’analyse :
Cette grammaire
n’est pas LL(1)
Il y a deux réductions pour la case M[A, c], donc ce n’est
pas une grammaire LL(1) On ne peut pas utiliser cette
méthode d‘analyse, pour pouvoir choisir entre la
production A →cd et la production A →c, il faut lire la lettre
qui suit celle que l’on pointe (donc deux symboles de
prévision sont nécessaires).
Grammaires LL(1)
Théorème :
Une grammaire ambiguë ou récursive à gauche n‘est pas
LL(1)
Définition d’une grammaire LL(1)
Principe
●
Construire l’arbre de dérivation en démarrant des unités
lexicales (feuilles) d’une chaîne jusqu’à arriver à la racine
(axiome de départ)
●
Des réductions successives jusqu’à retrouver l’axiome de
départ de la grammaire.
●
On procède à la réduction des symboles on allant de
gauche à droite.
●
Parfois plusieurs règles peuvent être utilisées pour réduire
une suite de symboles.
Réduction
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
Analyse ascendante par décalage-réduction
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
Analyse ascendante par décalage-réduction
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
Analyse ascendante par décalage-réduction
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
S→aaSSac| b
Pile Entrée Action
$ aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
S→aaSSac| b
Pile Entrée Action
$ε aabbac$ Décalage
$a abbac$ Décalage
$aa bbac$ Décalage
$S $ sucées
Méthode d’Analyseur LR
C’est une méthode d’analyse syntaxique ascendante qui peut être
utilisée pour analyser une large classe de grammaires non
contextuelles.
Cette technique est appelée analyse LR(k) :
L signifie le parcours de l’entrée de gauche vers la droite (Left to
right scanning of the input)
R signifie en construisant une dérivation droite inverse
(constructing a Rightmost derivation in reverse)
k indique le nombre de symboles de prévision utilisés pour
prendre une décision d’analyse. Quand k est omis, k est supposé
être égal à 1.
Méthode d’Analyseur LR
Avantages
Les analyseurs LR reconnaissent virtuellement toutes les
constructions des langages de programmation qui peuvent être
décrits par des un grammaire non contextuelle La méthode
d’analyse LR peut être implantée aussi efficacement que les autres
méthodes par décalage-réduction Un analyseur LR peut détecter
une erreur de syntaxe aussitôt que possible au cours d’un parcours
de gauche à droite de l’entrée.
Inconvénient
La méthode d’analyse LR exige de fournir un outil spécialiser pour
construire les analyseurs (Bison/yacc)
Une quantité de travail trop importante pour construire à la main
un analyseur
Techniques de construction des tables d’analyse LR
Pour la construction des Tables d’analyse LR à partir d’une grammaire, nous
distinguons trois méthodes qui diffèrent par leur puissance et leur facilité
d’implantation :
1 - La première est appelée Simple LR ou SLR. Elle est la plus simple à implanter
mais la moins puissante en terme de nombre de grammaires pour lesquelles elle
réussit.
2 - la seconde méthode, appelée LR canonique est la plus puissante mais la plus
coûteuse.
3 - La troisième méthode, appelée LookAhead LR (LALR) a une puissance et un
coût intermédiaire entre les deux. elle est applicable à la plupart des grammaires
de langages de programmation.
Les deux dernières méthodes augmentent la méthode SLR avec une information
de prévision.
Construction de la table d’analyse SLR
➔
Chaque état de cet automate est défini par un ou
plusieurs items
➔
Un item appelé aussi item de G est une règle contenant
un point (•) obtenue par la transformation d’une règle de
G:
La première règle de G (S’→S$) est transformée en
une règle : S’→•S$
Le but d’ajouter un • est de savoir ce qui est déjà reconnu et ce qui
n’est pas encore reconnu. Tout ce qui est à gauche du • est
reconnu tout ce qui est à droite du • on doit le reconnaître.
On s’apprête de reconnaître un mot qui dérive de S (axiome)
Construire un automate à pile fini non
déterministe les items
➔
Les transitions de l’automate sont étiquetées par des symboles
terminaux (mots vide inclus) ou non terminaux.
Construire un automate à pile fini non
déterministe États de l’automate
●
Exemple de génération des états de l’automate
E →E•+T E Retrouver +T
E →E+T
E →E+•T E+ Retrouver T
●
État initiale de l’automate c’est l’état qui contient la règle :
S’→•S$
●
États finaux de l’automate sont les états qui contiennent
au moins un item de la forme : A→α• (c’est à dire il y a
plus à reconnaître)
Construire un automate à pile fini non
déterministe États de l’automate
●
Les items , répartis en sous ensembles, forment les états de
l’automate, et sont données par des fermetures de sous
ensembles d’items.
On applique
fermetures
Calcul de la fermeture de l’ensemble
d’items I
Etapes :
1 - Augmentation de la grammaire S’→S
2 - On pose l’item I = {S’→•S}
3 - Calcul de l’item I0 : I0 = fermeture (I)
4 - Calcul de la transition dans I0 : Δ(I0,X) pour construire de
nouvelles items. (Δ() ou ALLER_A() ou tr() : fonction de transition)
5 - Arrêt lorsque aucun nouveau item ne peut être trouvé.
L’analyse SLR
Exemple
E →E + T Premier Suivant
E →T
T→T*F E {(,id} {$,+,)}
T→F
F → (E) T {(,id} {$,+,),*}
F → id
F {(,id} {$,+,),*}
L’analyse SLR
Étape 1
Augmentation de la grammaire
E’→E
E →E + T
E →T
T→T*F
T→F
F → (E)
F → id
L’analyse SLR
E’→E
E →E + T
Étape 2 E →T
Calcul de l’item I T→T*F
I = {E’→•E} T→F
F → (E)
F → id
Étape 3
Calcul item I0 : I0 =Fermeture (I)
I0 =Fermeture {E’→•E}
I0 =Fermeture {E’→•E, E →•E + T, E →•T, T → •T * F, T → •F, F → •(E),F → •id}
E’→E
E →E + T
L’analyse SLR E →T
T→T*F
T→F
F → (E)
F → id
Étape 4
Calcul de la transition I0 : Δ(I0,X) :
I0 = {E’→•E, E →•E + T, E →•T, T → •T * F, T → •F, F → •(E),F →
•id}
Avec X = {E, T, F, (, id}
Δ(I0,E) = {E’→E•, E →E• + T} = I1
Δ(I0,T) = {E →T•, T → T• * F} = I2
Δ(I0,F) = {T → F•} = I3
Δ(I0,() = {F → (•E), E →•E + T, E →•T, T → •T * F, T → •F, F →
•(E),F → •id} = I4
Δ(I0,id) = {F → id•} = I5
E’→E
E →E + T
L’analyse SLR E →T
T→T*F
Calcul de la transition dans I1 : Δ(I1,X) T→F
F → (E)
On a trouvé I1 ={E’→E•, E →E• + T} F → id
Avec X = {+}
Δ(I1,+) = {E →E +• T, T → •T * F, T → •F, F → •(E),F → •id} =I6
Transitions
Δ(I0,E) = I1 Δ(I4,id) = I5
Δ(I0,T) = I2 Δ(I6,T) = I9
Δ(I0,F) = I3 Δ(I6,F) = I3
Δ(I0,() = I4 Δ(I6,() = I4
Δ(I0,id) = I5 Δ(I6,id) = I5
Δ(I1,+) = I6 Δ(I7,F) = I10
Δ(I2,*) = I7 Δ(I7,() = I4
Δ(I4,E) = I8 Δ(I7,id) = I5
Δ(I4,T) = I2 Δ(I8,)) = I11
Δ(I4,F) = I3 Δ(I8,+) = I6
Δ(I4,() = I4
Automate
(1) E’→E Premier Suivant
(2) E →E + T
(3) E →T E {(,id} {$,+,)}
(4) T→T*F
T {(,id} {$,+,),*}
(5) T→F
(6) F → (E) F {(,id} {$,+,),*}
(7) F → id
126 / 148
127 / 148
Actions Successeurs
Terminaux Non-Terminaux
Items + * ( ) id $ E T F
I0 d4 d5 1 2 3
I1 d6 Acc
I2 r3 d7 r3 r3
I3 r5 r5 r5 r5
I4 d4 d5 8 2 3
I5 r7 r7 r7 r7
I6 d4 d5 9 3
I7 d4 d5 10
I8 d6 d11
I9 r2 r2 r2
I10 r4 r4 r4 r4
128 / 148
I11 r6 r6 r6 r6
Exercice d’application
Énoncé :
Construire la table d’analyse SLR(1) pour la grammaire
avec les règles de production suivantes :
(1) S → L = R
(2) S → R
(3) L → ∗R
(4) L → id
(5) R → L
Solution : Calcul des items et des SUIVANT
●
prend comme arguments un état et un symbole non-
terminal et retourne un état
Table d’analyse
Le programme dirigeant l’analyseur LR se comporte de la façon
suivante.
Il détermine sm , l’état en sommet de pile, et ai , le symbole
terminal d’entrée courant.
Il consulte alors Action[sm , ai ], l’entrée de la table des actions
pour l’état sm et le terminal ai qui peut avoir l’une des quatre
valeurs :
Motivation :
L’analyse LR canonique est plus performante que la technique SLR car elle
permet d’analyser avec succès un nombre plus important de grammaires.
Dans la méthode SLR, l’état i indique une action réduire par A → α à la vue
d’un terminal a appartenant à SUIVANT(A).
Cependant, dans certains cas, quand l’état i apparaı̂ t en sommet de pile, le
préfixe viable βα de la pile est tel que βA ne peut être suivi par a dans
aucune proto-phrase. Par conséquent, réduire par A → α est invalide à la
vue de a.
Il faut attacher plus d’information à un état : information qui permet
d’éviter les réductions invalides comme A → α
Information supplémentaire dans l’état : ajouter un symbole terminal
comme second composant d’un item ([A → α . β, a])
Algorithme :
Entrée : Une grammaire augmentée G’
Sortie : Les fonctions Action et Successeur des tables canoniques
d’analyse LR associées à G’.
Méthode :
1- Construire C = {I0 , I1 ,. . ., In }, la collection des ensembles d’items
LR(1) pour G’.
2 - L’état i est construit à partir de Ii . Les actions d’analyse pour l’état i
sont déterminées comme suit :
1 Si [A → α.aβ ,b] est dans Ii et Transition(Ii , a) = Ij , remplir Action[i, a]
avec décaler j . Ici a doit être un terminal
2 Si [A → α. ,a] est dans Ii , A ̸= S ′ , remplir Action[i, a] avec réduire par
A → α.
Construction des tables canoniques d’analyse LR