Analyse Syntaxique
Analyse Syntaxique
Sommaire
➢ Rôle de l’analyseur syntaxique
➢ Définition d’une grammaire hors contexte
➢ Comment écrire une GHC ?
➢ Dérivation
➢ Langage généré par une GHC
➢ Arbres de dérivation et GHC ambiguës
➢ Langages hors contexte
➢ Précédence d’opérateurs
ESPRIM Khouja Med Khairallah 2
CH5. Analyse syntaxique
Sommaire
Sommaire
Rôle de l'analyseur
syntaxique
Flot de Analyseur
caractères lexical
Fichier
jetons
source
▪ Les expressions.
▪ Les déclarations.
➢ Arbre syntaxique :
✓ L’analyseur syntaxique reconnaît la structure
syntaxique d’un programme et la représente de
manière appropriée à un traitement ultérieur par
d’autres modules du compilateur.
✓ Une représentation possible est un arbre
syntaxique qui peut être décoré ou transformé et
finalement traduit dans un langage assembleur
ou autre.
ESPRIM Khouja Med Khairallah 10
CH5. Analyse syntaxique
➢ Arbre syntaxique :
✓ Un arbre syntaxique possède un nœud racine,
des nœuds intérieurs et des feuilles (nœuds
terminaux).
✓ Les feuilles d’un arbre syntaxique sont les jetons
trouvés par l’analyseur lexicale.
✓ Si on lit ces feuilles de gauche à droite, on trouve
une séquence identique au texte saisi dans le
fichier source.
ESPRIM Khouja Med Khairallah 11
CH5. Analyse syntaxique
➢ Arbre syntaxique :
✓ Deux choses sont importantes pour former un
arbre syntaxique :
▪ Savoir comment les feuilles seront combinées
pour former la structure complète de l'arbre.
▪ Savoir comment les nœuds intérieurs seront
étiquetés.
▪ a = b + c - 5 *; // expression manquante
▪ = 12 + 5; // identificateur manquant
▪ a = = 3; // expression invalide
A → X1…Xn
ESPRIM Khouja Med Khairallah 24
CH5. Analyse syntaxique
➢ Convention d’écriture :
✓ Les symboles "non terminaux" seront désignés
par des lettres majuscules : A, B, ... etc.
✓ Les symboles "terminaux" seront désignés par
des lettres minuscules : a, b, ... etc.
✓ L’axiome sera désigné par la lettre S.
▪ S→a
▪ S → aS
▪ S → aS
▪ S→
▪ S → aSb
▪ S → aSa
▪ S→M
▪ M→b
▪ M → bM
➢ Exemples de grammaires :
✓ Dans cette notation, la grammaire précédente
serait écrite sous la forme suivante :
▪ S → M | aSa
▪ M → b | bM
✓ Exp → Number
✓ Exp → (Exp)
✓ Exp → - Exp
Dérivation
Dérivation
➢ La notion de dérivation :
✓ L'idée de dérivation est de considérer les
productions comme des "règles de réécriture".
✓ Chaque fois qu’on a un "non terminal", on peut le
remplacer par un terme figurant dans la partie
droite de toute production dans laquelle le non
terminal apparaît sur le côté gauche.
Dérivation
➢ La notion de dérivation :
✓ On peut faire ceci n'importe où dans une suite de
symboles (terminaux ou non terminaux) et on le
répète jusqu’à n’avoir que des terminaux dans la
partie gauche.
✓ La séquence de terminaux est une suite de mots
du langage défini par la GHC.
✓ Formellement, on défini la dérivation par les
trois règles suivantes :
ESPRIM Khouja Med Khairallah 49
CH5. Analyse syntaxique
Dérivation
➢ La notion de dérivation :
▪ s’il existe une production →
▪
▪ s’il existe une dérivation et une
dérivation
✓ Les symboles , et sont des mots sur (V T)*.
✓ La première règle stipule que l'utilisation d'une
production comme une règle de réécriture est une
dérivation (en une étape).
ESPRIM Khouja Med Khairallah 50
CH5. Analyse syntaxique
Dérivation
➢ La notion de dérivation :
✓ La deuxième règle indique que la dérivation est
une relation réflexive, c-à-d qu’une suite dérive
d’elle-même.
✓ La troisième règle exprime la transitivité de la
dérivation, c-à-d qu’une séquence de dérivations
est également une dérivation.
✓ On peut utiliser la dérivation pour définir
formellement le langage généré par une GHC.
ESPRIM Khouja Med Khairallah 51
CH5. Analyse syntaxique
Dérivation
Dérivation
➢ Définition formelle de la dérivation :
✓ On dit que la forme ’ "dérive en k étapes" de la
forme , et l’on écrit k ’, si (k + 1) formes
0, …, k telles que :
▪ 0 = .
▪ k = ’.
▪ i {0, …, k - 1} : i i+1.
Dérivation
➢ Explication de la dérivation :
✓ La forme « ’ » "dérive en une étape" de la forme
« » si et seulement, il existe une règle de
production « A → », telle que la substitution du
symbole « A » par la forme « » dans la forme
« » produit exactement la forme « ’ ».
✓ La dérivation en plusieurs étapes découle de la
répétition un certain nombre de fois du processus
de dérivation en une seule étape.
ESPRIM Khouja Med Khairallah 54
CH5. Analyse syntaxique
Dérivation
➢ Exemple :
✓ Considérons la GHC G sur {a, b, c} définie par les
productions suivantes :
▪ S → R | aSc
▪ R → | RbR
Dérivation
➢ Exemple (suite) :
✓ La forme « aaaacccc » dérive en 5 étapes de la
forme « aSc ». En effet :
▪ aSc aaScc (S → aSc)
▪ aaaaScccc aaaaRcccc (S → R)
▪ aaaaRcccc aaaacccc (R → )
Dérivation
Dérivation
➢ Dérivation la plus à gauche et dérivation la plus
à droite :
✓ Exemple :
❖ A → BC
❖ B → aS | cS |
❖ C → aB | bB |
ESPRIM Khouja Med Khairallah 58
CH5. Analyse syntaxique
Dérivation
➢ Dérivation la plus à gauche et dérivation la plus
à droite :
✓ Dérivation la plus à gauche du mot w = acabbc :
▪ S aBc (S → aBc)
▪ aBc acSc (B → cS)
▪ acSc acaCbc (S → aCb)
▪ acaCbc acabBbc (C → bB)
▪ acabBbc acabbc (B → )
ESPRIM Khouja Med Khairallah 59
CH5. Analyse syntaxique
Dérivation
➢ Dérivation la plus à gauche et dérivation la plus
à droite :
✓ Dérivation la plus à droite du mot w = acabbc :
▪ S aAc (S → aBc)
▪ aAc aBCc (A → BC)
▪ aBCc aBbBc (C → bB)
▪ aBbBc aBbc (B → )
▪ aBbc acSbc (B → cS)
▪ acSbc acaCbbc (S → aCb)
ESPRIM Khouja Med Khairallah 60
CH5. Analyse syntaxique
Dérivation
➢ Dérivation la plus à gauche et dérivation la plus
à droite :
✓ Dérivation la plus à droite du mot w = acabbc :
▪ acaCbbc acabbc (C → )
Langage généré
par une GHC
➢ Définition :
✓ Soit G = (V, T, P, S) une GHC.
✓ Le "langage généré par G" est formé par tous les
mots de T* dérivables en plusieurs étapes à partir
de l’axiome S de G.
✓ On note ce langage par L(G).
✓ Formellement, L(G) = {w T* | S * w}.
➢ Exemples :
✓ Soient les GHC suivantes :
▪ G1 définie sur T = {a} par les productions :
S → et S → aS.
▪ G2 définie sur T = {a, b} par les productions :
S → aSb | .
▪ G3 définie sur T = {a, b} par les productions :
S → aSb | bSa | SS | ab | ba | .
ESPRIM Khouja Med Khairallah 64
CH5. Analyse syntaxique
➢ Exemples :
✓ On a :
▪ L(G1) = {, a, aa, aaa, …} = {an; n entier}.
Arbres de dérivation et
grammaires ambiguës
▪ S → aTb
▪ S→c
▪ T → cSS
▪ T→S
E + E
a E * E
b c
Un arbre syntaxique
pour a + b * c
ESPRIM Khouja Med Khairallah 71
CH5. Analyse syntaxique
E * E
E + E c
a b
Un autre arbre syntaxique
pour a + b * c
ESPRIM Khouja Med Khairallah 72
CH5. Analyse syntaxique
Langages
hors contexte
➢ Théorème 2 :
✓ La classe des langages hors contexte est stable
par les opérations régulières :
▪ Réunion.
▪ Concaténation.
Precedence
d'opérateurs
Précédence d’opérateurs
➢ Ambiguitë des grammaires d’opérateurs :
✓ La grammaire de la page 70 est une grammaire
d’opérateurs ambiguë.
✓ Un moyen possible de résoudre l'ambiguïté est
d'utiliser des règles de priorité au cours de
l’analyse syntaxique pour pouvoir effectuer un
choix parmi les arbres de dérivation possibles.
✓ De nombreux générateurs d’analyseurs
syntaxiques optent pour cette approche.
ESPRIM Khouja Med Khairallah 79
CH5. Analyse syntaxique
Précédence d’opérateurs
Précédence d’opérateurs
➢ Quelques concepts sur les opérateurs :
✓ Un opérateur est "associatif à gauche", si
l'expression « a b c » doit être évaluée de
gauche à droite : a b c = (a b) c.
✓ Un opérateur est "associatif à droite", si
l'expression « a b c » doit être évaluée de
droite à gauche : a b c = a (b c).
✓ Un opérateur est "non associatif", si les
expressions de la forme a b c sont illégales.
ESPRIM Khouja Med Khairallah 81
CH5. Analyse syntaxique
Précédence d’opérateurs
➢ Exemples :
✓ Dans le langage C :
▪ +, -, *, /, %, sont associatifs à gauche.
Précédence d’opérateurs
Précédence d’opérateurs
▪ Expr → Expr’
Précédence d’opérateurs
➢ Associativité des opérateurs :
✓ Exemple : comment analyser 2 + 3 + 4 ?
Précédence d’opérateurs
▪ Expr → Expr’
Précédence d’opérateurs
➢ Associativité des opérateurs :
✓ Exemple : comment analyser a = b = c ?
E
E’ = E
a E’ = E
b E’
c
ESPRIM Khouja Med Khairallah 87
CH5. Analyse syntaxique
Précédence d’opérateurs
▪ Expr → Expr’
Précédence d’opérateurs
➢ Associativité des opérateurs :
✓ Exemple : voyons si l’on peut analyser
l’expression 2 < 3 < 4 ?
E
Échec de l’analyse
E’ < E’ syntaxique
2 3
Précédence d’opérateurs
Précédence d’opérateurs
Précédence d’opérateurs
Précédence d’opérateurs
Précédence d’opérateurs
Précédence d’opérateurs
Précédence d’opérateurs
➢ Priorité des opérateurs :
✓ Par conséquent, les règles de productions issues
d’un non terminal et correspondant à un niveau
de priorité se réfèrent seulement à des non
terminaux qui correspondent à la même priorité
ou aux niveaux de priorité supérieurs.
✓ Exemple : construisons une grammaire hors
contexte pour les 4 opérateurs arithmétiques
usuels +, -, * et /.
ESPRIM Khouja Med Khairallah 96
CH5. Analyse syntaxique
Précédence d’opérateurs
➢ Priorité des opérateurs :
✓ On aura :
▪ Un non terminal pour + et -.
Précédence d’opérateurs
➢ Priorité des opérateurs :
✓ Une GHC non ambiguë pour les 4 opérateurs
arithmétiques usuels est donc :
▪ Expr → Expr + Expr1 | Expr - Expr1 | Expr1
Précédence d’opérateurs
Arbre de
dérivation
pour 2+3*4
Autres sources
d'ambiguitë
➢ Problème de if-then-else :
✓ Considérons la GHC suivante (Pascal) :
▪ Instr → Ident := Expr
➢ Problème de if-then-else :
✓ L’instruction précédente a deux arbres de
dérivation distincts :
✓ Première dérivation :
▪ Instr IF Expr THEN Instr IF p THEN Instr
IF p THEN IF Expr THEN Instr ELSE Instr
IF p THEN IF q THEN Instr ELSE Instr IF p
THEN IF q THEN S1 ELSE Instr IF p THEN
IF q THEN S1 ELSE S2
ESPRIM Khouja Med Khairallah 102
CH5. Analyse syntaxique
➢ Problème de if-then-else :
✓ Deuxième dérivation :
▪ Instr IF Expr THEN Instr ELSE Instr IF p
THEN Instr ELSE Instr IF p THEN IF Expr
THEN Instr ELSE Instr IF p THEN IF q THEN
Instr ELSE Instr IF p THEN IF q THEN S1
ELSE Instr IF p THEN IF q THEN S1 ELSE
S2
ESPRIM Khouja Med Khairallah 103
CH5. Analyse syntaxique
➢ Problème de if-then-else :
✓ Comment peut-on faire pour rendre une telle
grammaire non ambiguë ?
✓ On peut pouvons traiter « si-alors-sinon » comme
des opérateurs associatifs à droite, ceci pour
faire correspondre un « sinon » au « si-alors » le
plus proche sans correspondant.
➢ Problème de if-then-else :
✓ Toutefois, les transformations indiquées dans la
section « Précédence des opérateurs » ne
peuvent être appliquées directement à la
grammaire précédente, car les productions n’ont
pas la bonne forme.
✓ Mais, quand un « si » et un « sinon » se
correspondent, tous les « si » qui apparaissent
entre ce « si-sinon », doivent avoir des « sinon ».
ESPRIM Khouja Med Khairallah 105
CH5. Analyse syntaxique
➢ Problème de if-then-else :
✓ Par conséquent, on fera deux non terminaux :
▪ Un non terminal pour les conditionnelles avec
un « sinon ».
▪ Un non terminal pour les conditionnelles sans
« sinon ».
▪ Le résultat est montré dans la grammaire
suivante.
ESPRIM Khouja Med Khairallah 106
CH5. Analyse syntaxique
➢ Problème de if-then-else :
✓ Cette grammaire résout également l'associativité
de la virgule (droite) et la priorité de « si » sur la
virgule.
✓ Une alternative à la réécriture des grammaires
pour résoudre l'ambiguïté est d'utiliser une
grammaire ambiguë, puis résoudre les conflits en
utilisant des règles de priorité au cours de la
phase de l'analyse syntaxique.
ESPRIM Khouja Med Khairallah 108
CH5. Analyse syntaxique
➢ Problème de if-then-else :
✓ Tous les cas d'ambiguïté doivent être traités avec
soin : il ne suffit pas d’éliminer l'ambiguïté, mais
on doit le faire d'une manière à aboutir à la
structure de dérivation souhaitée.
✓ Les deux exemples de grammaires pour les
opérateurs arithmétiques et les « si-alors-sinon »,
nous ont montré qu’en général, les structures de
dérivation sont très différentes.
ESPRIM Khouja Med Khairallah 109
CH5. Analyse syntaxique
Les techniques
d'analyse syntaxique
Analyse syntaxique
descendante
Analyse syntaxique
descendante
➢ Exemple :
✓ Considérons la GHC suivante :
▪ S → aSbT (1)
▪ S → cT (2)
▪ S→d (3)
▪ T→c (4)
▪ T → bS (5)
Analyse syntaxique
descendante
➢ Exemple :
✓ Prenons le mot « w = accbbadbc ».
✓ Nous allons calculer la dérivation la plus à
gauche du mot w.
✓ On part de l’arbre contenant la racine étiqueté
par l’axiome de la grammaire « S ».
Analyse syntaxique
descendante
➢ Paramètres de l’algorithme d’analyse :
✓ L’algorithme manipule trois entités :
▪ Une "forme" représentant en quelques sortes
"une approximation possible de l’analyse".
▪ La "chaîne d’entrée".
Analyse syntaxique
descendante
➢ Initialisations :
✓ Au départ, la forme est l’axiome « S » de la
grammaire auquel on ajoute à la fin un marquer
de fin de « $ ». On partira donc de l’état initial :
▪ Forme = « S$ ».
▪ Chaîne = « accbbadbc$ ».
Analyse syntaxique
descendante
➢ Itération (1) :
✓ On lit le premier caractère dans la chaîne
d’entrée : « a ».
✓ On développe le symbole non terminal « S » :
Analyse syntaxique
descendante
pf
S$
accbbadbc$
a S b T
pt
Analyse syntaxique
descendante
➢ Itération (2) :
✓ On lit le deuxième caractère dans la chaîne
d’entrée : « c ».
✓ On cherche le non terminal le plus à gauche
parmi les fils qui viennent d’être crées : « S ».
✓ La S-production qui débute avec un « c » est la
production (2) qui est « S → cT ».
✓ On crée les fils de « S » : 2 nœuds étiquetés
respectivement par « c » et « T ».
ESPRIM Khouja Med Khairallah 122
CH5. Analyse syntaxique
Analyse syntaxique
descendante
pf
S$
accbbadbc$
a S b T
pt
c T
Analyse syntaxique
descendante
➢ Itération (3) :
✓ On lit le 3 ème caractère dans la chaîne d’entrée :
« c ».
✓ On cherche le non terminal le plus à gauche
parmi les fils qui viennent d’être crées : « T ».
✓ La T-production qui débute avec un « c » est la
production (4) qui est « T → c ».
✓ On crée le fils de « T » : un nœud étiqueté par la
lettre « c ».
ESPRIM Khouja Med Khairallah 124
CH5. Analyse syntaxique
Analyse syntaxique
descendante
S$
pf
accbbadbc$
a S b T
pt
c T
c
ESPRIM Khouja Med Khairallah 125
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Itération (4) :
✓ On lit le 4 ème caractère dans la chaîne d’entrée :
« b ».
✓ Pas de terminal parmi les fils qui viennent d’être
crées, donc on cherche un non terminal parmi les
ancêtres du nœud fils : il y en a un qui est « T ».
✓ Mais, avant ce « T », il y a un terminal « b » qui
concorde avec le caractère couramment lu.
✓ On avance à la fois les deux pointeurs pf et pt.
ESPRIM Khouja Med Khairallah 126
CH5. Analyse syntaxique
Analyse syntaxique
descendante
pf S$
accbbadbc$
a S b T
pt
c T
c
ESPRIM Khouja Med Khairallah 127
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Itération (5) :
✓ On lit le 5 ème caractère dans la chaîne d’entrée :
« b ».
✓ On développe le non terminal « T ».
Analyse syntaxique
descendante
S$
pf accbbadbc$
a S b T
pt
c T
b S
c
ESPRIM Khouja Med Khairallah 129
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Itération (6) :
✓ On lit le 6 ème caractère dans la chaîne d’entrée :
« a ».
✓ On développe le non terminal « S » (le fils
immédiat de « T » le plus à gauche).
✓ La S-production qui débute avec un « a » est la
production (1) : « S → aSbT ».
✓ On crée les fils de « S » : 4 nœuds étiquetés
respectivement par « a », « S », « b » et « T ».
ESPRIM Khouja Med Khairallah 130
CH5. Analyse syntaxique
Analyse syntaxique
descendante
S$
pf
a S b T accbbadbc$
c T
pt
b S
c
a S b T
ESPRIM Khouja Med Khairallah 131
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Itération (7) :
✓ On lit le 7 ème caractère dans la chaîne d’entrée :
« d ».
✓ On développe le non terminal « S » (le fils
immédiat de « S » le plus à gauche).
✓ La S-production qui débute avec un « d » est la
production (3) : « S → d ».
✓ On crée les fils de « S » : un nœud étiqueté par
« d ».
ESPRIM Khouja Med Khairallah 132
CH5. Analyse syntaxique
Analyse syntaxique
descendante
S$
pf
a S b T
accbbadbc$
c T
b S pt
c
a S b T
Analyse syntaxique
descendante
➢ Itération (8) :
✓ On lit le 8 ème caractère dans la chaîne d’entrée :
« b ».
✓ Pas de terminal parmi les fils qui viennent d’être
crées, donc on cherche un non terminal parmi les
ancêtres du nœud fils : il y en a un qui est « T ».
✓ Mais, avant ce « T », il y a un terminal « b » qui
concorde avec le caractère couramment lu.
✓ On avance à la fois les deux pointeurs pf et pt.
ESPRIM Khouja Med Khairallah 134
CH5. Analyse syntaxique
Analyse syntaxique
descendante
pf S$
a S b T
accbbadbc$
c T
b S pt
c
a S b T
Analyse syntaxique
descendante
➢ Itération (9) :
✓ On lit le 9 ème caractère dans la chaîne d’entrée :
« c ».
✓ On développe le non terminal « T ».
Analyse syntaxique
descendante
S$
pf
a S b T
accbbadbc$
c T
b S pt
c
a S b T
Analyse syntaxique
descendante
➢ Fin de l’algorithme :
✓ On arrive à la fin de la chaîne de caractères
(lecture du marqueur « $ »).
✓ L’algorithme se termine.
Analyse syntaxique
S descendante
a S b T
Arbre syntaxique du
c T mot "accbbadbc"
b S
c
a S b T
d c
ESPRIM Khouja Med Khairallah 139
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Algorithme d’analyse syntaxique descendante :
✓ On part de la racine étiqueté par l’axiome de la
grammaire.
✓ On réalise d’une manière répétitive les deux
étapes ci-dessous :
▪ Étape 1 : au nœud n, étiqueté par le non
terminal « A », choisir une des productions
issues de « A » et construire les fils de n avec
les symboles en partie droite de la production.
ESPRIM Khouja Med Khairallah 140
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Algorithme d’analyse syntaxique descendante :
Étape 2 : déterminer le prochain nœud où un
▪
sous-arbre doit être construit.
✓ Pour certaines grammaires, les deux étapes
précédentes peuvent être implantées au cours
d’un seul parcours gauche-droite de la chaîne
d’entrée.
✓ L’unité lexicale qui vient d’être reconnue dans le
flot d’entrée est souvent appelé "symbole de
prévision" (lookahead).
ESPRIM Khouja Med Khairallah 141
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Algorithme d’analyse syntaxique descendante :
✓ Quand les fils sont ajoutés à un nœud, on prend
d’abord en compte le fils le plus à gauche.
✓ Quand le nœud en cours de développement dans
l’arbre syntaxique correspond à un terminal, et
que ce terminal concorde avec le symbole de
prévision, on progresse à la fois dans l’arbre
syntaxique et dans l’entrée.
ESPRIM Khouja Med Khairallah 142
CH5. Analyse syntaxique
Analyse syntaxique
descendante
➢ Algorithme d’analyse syntaxique descendante :
✓ En général, la sélection d’une production pour un
non terminal, est un processus "d’essai avec
possibilité de retour en arrière" (backtraking).
✓ Dans un tel processus, on commence par
essayer une production, puis si cette production
ne convient pas, on peut rebrousser chemin pour
essayer une autre production différente.
Analyse syntaxique
descendante
➢ Algorithme d’analyse syntaxiques descendante :
✓ Une production ne convient pas si, après
utilisation de cette production, on n’arrive pas à
compléter l’arbre syntaxique pour que son mot
des feuilles coïncide avec la chaîne d’entrée.
✓ Cependant, il existe une situation particulière très
importante, appelée "analyse syntaxique
prédictive", dans lequel le rebroussement n’est
pas nécessaire.
Analyse syntaxique
prédictive
▪ A→
Grammaires
récursives à gauche
Grammaires récursives à
gauche
➢ Définitions :
✓ Une GHC est dite "immédiatement récursive à
gauche", si elle contient une production de la
forme « A → A ».
✓ Une GHC est dite "indirectement récursive à
gauche", si elle contient un symbole non terminal
« A » tel qu’il existe une dérivation d’au moins
une étape de la forme « A + A » où « » une
forme quelconque de la grammaire.
ESPRIM Khouja Med Khairallah 166
CH5. Analyse syntaxique
Grammaires récursives à
gauche
➢ Exemples :
✓ Soit G la GHC suivante :
▪ S → ScA | B
▪ A → Aa |
▪ B → Bb | d | e
Grammaires récursives à
gauche
➢ Exemples :
✓ Soit G la GHC suivante :
▪ S → Aa | b
▪ A → Bc
▪ B → Sb |
Grammaires récursives à
gauche
➢ Grammaires récursives à gauche et analyse
descendante :
✓ Avec une grammaire récursive à gauche, on ne
peut pas faire une analyse syntaxique
descendante.
✓ Un analyseur descendant d’une grammaire
récursive à gauche peut provoquer des boucles
infinies.
Grammaires récursives à
gauche
➢ Grammaires récursives à gauche et analyse
descendante :
✓ Prenons la production « A → Ab ».
Grammaires récursives à
gauche
➢ Grammaires récursives à gauche et analyse
descendante :
✓ Notons que le symbole de prévision ne change
que lorsqu’un terminal de la partie droite est
accepté.
✓ Comme la production commence par le non
terminal « A », aucun changement dans l’entrée
n’intervient entre les appels récursifs, ce qui
engendre une boucle infinie.
ESPRIM Khouja Med Khairallah 171
CH5. Analyse syntaxique
Grammaires récursives à
gauche
➢ Grammaires récursives à gauche et analyse
descendante :
✓ Il est donc impossible de réaliser un analyseur
syntaxique descendant avec de telles
grammaires.
✓ Cependant, en procédant par un nettoyage de la
grammaire, on peut arriver à réaliser un
analyseur syntaxique pour une grammaire
récursive au départ.
ESPRIM Khouja Med Khairallah 172
CH5. Analyse syntaxique
Grammaires récursives à
gauche
➢ Algorithme d’élimination de la récursivité à
gauche immédiate :
✓ Remplacer toute règle de production de la forme
« A → A | » par les deux règles suivantes :
▪ A → A’
▪ A’ → A’ |
Grammaires récursives à
gauche
➢ Exemple :
✓ Prenons la GHC immédiatement récursive à
gauche :
▪ S → ScA | B
▪ A → Aa |
▪ B → Bb | d | e
Grammaires récursives à
gauche
➢ Exemple :
✓ On obtient la grammaire :
▪ S → BS’
▪ S’ → cAS’ |
▪ A → A’
▪ A’ → aA’ |
▪ B → dB’ | eB’
▪ B’ → bB’ |
ESPRIM Khouja Med Khairallah 175
CH5. Analyse syntaxique
Grammaires récursives à
gauche
➢ Algorithme d’élimination de la récursivité à
gauche indirecte :
✓ Ordonner les « non terminaux » de la grammaire
considérée : A1, A2, …, An.
✓ Pour i := 1 à n Faire :
▪ Pour j := 1 à (i -1) Faire :
Grammaires récursives à
gauche
Grammaires récursives à
gauche
➢ Exemple :
✓ Considérons la GHC récursive à gauche :
▪ S → Aa | b
▪ A → Ac | Sd |
Grammaires récursives à
gauche
➢ Exemple :
i = 2 et j = 1. On obtient : A → Ac | Aad | bd |
▪
A → bdA’ | A’
A’ → cA’ | adA’ |
✓ Donc, on a obtenu la grammaire suivante :
▪ S → Aa | b
▪ A → bdA’ | A’
▪ A’ → cA’ | adA’ |
ESPRIM Khouja Med Khairallah 179
CH5. Analyse syntaxique
Grammaires
factorisables à gauche
Grammaires factorisables à
gauche
➢ Factorisation à gauche :
✓ La factorisation à gauche est une transformation
grammaticale utile pour obtenir une grammaire
convenant à l’analyse syntaxique prédictive.
✓ L’idée de base est que, pour développer un non
terminal « A », quand il n’est pas évident de
choisir l’alternative à utiliser, on doit réécrire les
A-productions, de manière à différer la décision
jusqu’à ce que suffisamment de texte ait été lu,
pour faire le bon choix.
ESPRIM Khouja Med Khairallah 181
CH5. Analyse syntaxique
Grammaires factorisables à
gauche
➢ Exemple :
✓ Considérons la GHC suivante :
▪ S → abcdeaTca | abcdfXy
Grammaires factorisables à
gauche
➢ Algorithme de factorisation à gauche :
✓ Pour chaque non terminal « A », Faire :
▪ Trouver le plus long préfixe « » commun à
deux de ses alternatives ou plus.
▪ Si , Remplacer « A → 1|…|n|1|…|p »
(où les i ne commencent pas par ), par les
deux productions :
❖ A → A’ | 1 | … | p
❖ A’ → 1 | … | n
✓ Recommencer jusqu'à ne plus en trouver.
ESPRIM Khouja Med Khairallah 183
CH5. Analyse syntaxique
Grammaires factorisables à
gauche
➢ Exemple :
✓ Soit G la GHC suivante :
▪ S → iEtS | iEtSeS | a
▪ E→b
✓ On factorise G à gauche :
▪ S → iEtSS’ | a
▪ S’ → eS |
▪ E→b
Grammaires factorisables à
gauche
➢ Définitions :
✓ Une grammaire est dite "non factorisée à
gauche", si elle contient au moins une alternative
de la forme « A → X | Y ».
✓ Lorsqu’on applique l’algorithme de la factorisation
à gauche sur une grammaire, on obtient une
grammaire équivalente à celle de départ, et l’on
dit que cette grammaire est "factorisée à
gauche".
ESPRIM Khouja Med Khairallah 185
CH5. Analyse syntaxique
Exercice
Considérer la grammaire G=<N,T,P,S> dont les productions sont données ci-après :
P :<Instruction>→ if <Condition> then <Instruction> else <Instruction> |
if<Condition> then <Instruction> | begin <LI> end | i <Condition>→ c
<LI>→<LI> ; i | i
a) Montrer que la grammaire G précédente est ambiguë en donnant deux arbres
syntaxiques pour le fragment de programme suivant :
if c then if c then i else i
b) Comment pourra-t-on faire une analyse syntaxique "déterministe" pour ce type
d'instructions (instructions conditionnelles if).
a)
a)
b)
Analyse prédictive
non récursive
▪ Une pile.
▪ Un flot de sortie.
Analyseur Syntaxique
b Prédictive
S
$ Flot de sortie
Pile Table d’analyse
ESPRIM Khouja Med Khairallah 194
CH5. Analyse syntaxique
✓ Initialisations de l’algorithme :
▪ X est un terminal.
❖On dépile X.
➢ Itération de l’algorithme :
✓ 3ème cas : X est le symbole de fin $.
▪ Si a = $, alors l’analyse se termine en
énonçant un succès.
▪ Si a $, alors l’analyse se termine en
énonçant un cas d’erreur.
ps
Un non terminal au sommet :
S pile Dépiler(S), Empiler(S, a),
Afficher en sortie : S → aS
$
a b a b c $ Itération (2)
ps
a pile Concordance de ps et pile :
S Dépiler(a), Avancer(ps)
$
ESPRIM Khouja Med Khairallah 208
CH5. Analyse syntaxique
ps
pile Un non terminal au sommet :
S
Dépiler(S), Empiler(S, b),
$ Afficher en sortie : S → bS
a b a b c $ Itération (4)
ps
b pile Concordance de ps et pile :
S Dépiler(b), Avancer(ps)
$
ESPRIM Khouja Med Khairallah 210
CH5. Analyse syntaxique
a b a b c $
a b a b c $ Itération (6)
ps
a pile Concordance de ps et pile :
S Dépiler(a), Avancer(ps)
$
ESPRIM Khouja Med Khairallah 212
CH5. Analyse syntaxique
a b a b c $ Itération (8)
ps
b pile Concordance de ps et pile :
S Dépiler(b), Avancer(ps)
$
ESPRIM Khouja Med Khairallah 214
CH5. Analyse syntaxique
a b a b c $
a b a b c $ Itération (10)
ps
c pile Concordance de ps et pile :
$ Dépiler(c), Avancer(ps)
a b a b c $ Itération (11)
ps
$ pile Sommet = entrée = $ :
Arrêt de l’analyse
Sortie : Succès
ESPRIM Khouja Med Khairallah 217
CH5. Analyse syntaxique
▪ S → bS
▪ S → aS
▪ S → bS
▪ S→c
▪ ababc → ACCEPTE
ESPRIM Khouja Med Khairallah 218
CH5. Analyse syntaxique
EXERCICE
Construction de la table
d'analyse prédictive
Construction de la table
d’analyse prédictive
➢ Fonctions « PREMIER » et « SUIVANT » :
✓ L’analyseur prédictif s’appui sur la table d’analyse
syntaxique.
✓ La construction de cette table est facilitée par
deux fonctions associées à une grammaire : la
fonction « PREMIER » et « SUIVANT ».
✓ Ces deux fonctions nous permettent de remplir
les entrées de la table d’analyse prédictive pour
une grammaire G.
ESPRIM Khouja Med Khairallah 222
CH5. Analyse syntaxique
Construction de la table
d’analyse prédictive
➢ Fonctions « PREMIER » et « SUIVANT » :
✓ Si est une forme de G, PREMIER() désigne
l’ensemble des terminaux qui commencent les
mots qui se dérivent de .
✓ Pour chaque non terminal A, SUIVANT(A) définit
l’ensemble des terminaux qui peuvent apparaître
immédiatement à droite de A dans une dérivation
à partir de la racine de la grammaire.
ESPRIM Khouja Med Khairallah 223
CH5. Analyse syntaxique
Construction de la table
d’analyse prédictive
➢ Calcul de la fonction «PREMIER » :
✓ Formellement, un terminal a PREMIER(), si et
seulement s’il existe une dérivation de la forme
a.
✓ Soit X un symbole de la grammaire étudiée.
Construction de la table
d’analyse prédictive
➢ Définition de la fonction « NULLABLE » :
✓ Une forme est dite "nullable", si et seulement
s’il existe une dérivation de la forme .
✓ En particulier, si X est un symbole non terminal
tel que X → , alors X est nullable.
✓ On définit une fonction NULLABLE de (V T)*
vers {Vrai, Faux} de la façon suivante :
Construction de la table
d’analyse prédictive
➢ Définition de la fonction « NULLABLE » :
✓ NULLABLE() = Vrai.
✓ NULLABLE(a) = Faux, pour tout terminal de G.
Construction de la table
d’analyse prédictive
➢ Exemple :
✓ On considère la grammaire suivante :
▪ S → R | aSc
▪ R → bR |
Construction de la table
d’analyse prédictive
➢ Définition la fonction « PREMIER » :
✓ PREMIER() = {}.
✓ PREMIER(a) = {a}, pour tout terminal de G.
Construction de la table
d’analyse prédictive
➢ Exemple :
✓ On considère la grammaire suivante :
▪ S → R | aSc
▪ R → bR |
Construction de la table
d’analyse prédictive
➢ Algorithme pour la fonction « SUIVANT » :
✓ Ajouter le symbole $ à SUIVANT(S) (où S est
l'axiome de la grammaire).
✓ S'il y a une production A → B, où B est un non
terminal, alors ajouter le contenu de SUIVANT(A)
à SUIVANT(B).
✓ S'il y a une production A → B, alors ajouter le
contenu de PREMIER() à SUIVANT(B), sauf .
Construction de la table
d’analyse prédictive
Construction de la table
d’analyse prédictive
➢ Exemple :
✓ On considère la grammaire suivante :
▪ S → R | aSc
▪ R → bR |
Construction de la table
d’analyse prédictive
➢ Un autre exemple :
✓ On considère la grammaire suivante :
▪ E → TE’
▪ E’ → +TE’ |
▪ T → FT’
▪ T’ → *FT’ |
▪ F → (E) | id
Construction de la table
d’analyse prédictive
➢ Un autre exemple :
✓ Calcul des ensembles PREMIER :
▪ PREMIER(F) = {(, id}.
Construction de la table
d’analyse prédictive
➢ Un autre exemple :
✓ Calcul des ensembles SUIAVNT :
▪ SUIAVNT(E) = {), $}.
Construction de la table
d’analyse prédictive
➢ Construction d’une table d’analyse :
✓ Une table d'analyse syntaxique prédictive non
récursive est un tableau M à deux dimensions qui
indique pour chaque symbole non terminal X et
chaque symbole terminal a ou le symbole $, la
règle de production à appliquer.
✓ L’algorithme de construction d’une telle table est
le suivant :
ESPRIM Khouja Med Khairallah 236
CH5. Analyse syntaxique
Construction de la table
d’analyse prédictive
➢ Construction d’une table d’analyse :
✓ Pour chaque production A → Faire :
▪ Pour tout a PREMIER() (et a ), rajouter
la production A → dans la case M[A, a].
▪ Si PREMIER(), alors pour chaque
symbole b SUIVANT(A), ajouter A → dans
la case M[A, b].
▪ Chaque case M[A, a] vide est une erreur de
syntaxe.
ESPRIM Khouja Med Khairallah 237
CH5. Analyse syntaxique
Construction de la table
d’analyse prédictive
➢ Exemple : table d’analyse pour la grammaire de la
page 233.
id + * ( ) $
E E → TE’ E → TE’
E’ E’ → +TE’ E’ → E’ →
T T → FT’ T → FT’
T’ T’ → T’ → *FT’ T’ → T’ →
F F → id F → (E)
Construction de la table
d’analyse prédictive
➢ Retour sur l’analyse syntaxique prédictive non
récursive :
✓ On peut représenter facilement une analyse
prédictive non récursive en utilisant un tableau à
3 colonnes dont les contenus décrivent
respectivement :
▪ L’état de la pile (du fond au sommet);
T E’
Arbre syntaxique
F T’ du mot « id »
id
ESPRIM Khouja Med Khairallah 241
CH5. Analyse syntaxique
Grammaires
LL(1)
Grammaires LL(1)
➢ Définition :
✓ La table d’analyse M peut avoir des entrées
multiples.
✓ Par exemple, si la grammaire est récursive à
gauche ou ambiguë, la table d’analyse M aura au
moins une de ses entrées définie de façon
multiple.
✓ Une grammaire est dite LL(1), si sa table
d’analyse M ne contient que des entrées simples.
ESPRIM Khouja Med Khairallah 243
CH5. Analyse syntaxique
Grammaires LL(1)
➢ Que signifie le mot LL(1) ?
✓ Le premier « L » signifie « parcours de l’entreé de
la gauche vers la droite » (Left to right scanning).
✓ Le second « L » signifie « dérivation la plus à
gauche » (Leftmost derivation).
✓ Le « 1 » signifie qu’on utilise un seul symbole
d’entrée de prévision à chaque étape nécessitant
la prise de décision dans l’analyse.
✓ On peut généraliser ceci et parler de GHC LL(k).
ESPRIM Khouja Med Khairallah 244
CH5. Analyse syntaxique
Grammaires LL(1)
➢ Exemple :
✓ La grammaire définie par :
▪ S → aAd
▪ A → cd | c
Grammaires LL(1)
➢ Exemple :
✓ Donc on aura la table d’analyse suivante :
a b c d $
S S → aAd
A A → cd
A→c
Entrée multiple
ESPRIM
Not LL(1)
Khouja Med Khairallah 246
CH5. Analyse syntaxique
Grammaires LL(1)
➢ Théorème :
✓ Si une grammaire hors contexte est LL(1), alors :
▪ Elle est non ambiguë.
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
➢ Principe :
✓ L’analyse syntaxique ascendante essai de
construire un arbre syntaxique du bas (les unités
lexicales) vers le haut (l'axiome de la grammaire).
✓ L’analyse syntaxique ascendante utilise en
général un modèle appelé modèle par "décalage
& réduction".
✓ Ce modèle n'autorise que deux opérations :
▪ Décalage (shift) : consiste à décaler d'une
lettre le pointeur sur le mot d’entrée.
ESPRIM Khouja Med Khairallah 249
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Principe :
Réduction (reduce) : consiste à réduire une
▪
forme située à gauche du pointeur sur le mot
d’entrée et finissant sur ce pointeur, par un non
terminal en utilisant une des productions.
➢ Exemple :
✓ Considérons la grammaire définie par deux
règles de production suivantes : S → aSbS | c.
✓ Analysons le mot w = aaacbaacbcbcbcbacbc.
ESPRIM Khouja Med Khairallah 250
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
➢ Table d’analyse :
✓ Ça serait bien d'avoir une table qui nous dit si on
décale ou si on réduit, et par quoi, lorsque le
pointeur est sur une lettre donnée.
✓ La table d’analyse est une sorte d'automate,
qu'on appelle "automate à pile".
✓ Cette table va nous dire ce qu'il faut faire quand
on lit une lettre « a » et qu'on est dans un certain
état « i ». Il y a deux opérations à faire :
▪ Un décalage, ou bien
▪ Une réduction.
ESPRIM Khouja Med Khairallah 256
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Table d’analyse :
✓ Décalage : on empile la lettre lue et on va dans
un autre état « j ». Ce qui sera noté par « dj ».
✓ Réduction : on réduit par la règle de production
numéro « p », c'est à dire qu'on remplace la
chaîne en sommet de pile (qui correspond à la
partie droite de la règle numéro « p ») par le non
terminal de la partie gauche de la règle de
production, et on va dans l'état « j » qui dépend
du non terminal en question. On note cette action
par « rp ».
ESPRIM Khouja Med Khairallah 257
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Table d’analyse :
✓ L’action d’acceptation d’un mot est noté par ACC.
✓ Le refus d’un mot sera matérialisé par une case
vide.
➢ 0-items :
✓ Pour construire la table d’analyse, on utilise les
ensembles PREMIER et SUIVANT, plus ce qu'on
appelle des fermetures de "0-items".
✓ Un « 0-item » est une production de la grammaire
avec un « . » quelque part dans la partie droite.
ESPRIM Khouja Med Khairallah 258
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Exemples de 0-items :
▪ S → .aSbS
▪ S → [Link]
▪ S → [Link]
▪ S → aSb.S
▪ S → aSbS.
▪ S → .c
▪ S → c.
ESPRIM Khouja Med Khairallah 259
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Calcul de la fermeture d’un ensemble d’items I :
1. Mettre chaque item de I dans Fermeture(I).
2. Pour chaque item i de Fermeture(I) de la forme A
→ .B Faire :
Pour chaque production B → i Faire :
Rajouter l'item B → .i dans Fermeture(I)
3. Recommencer l’étape 2 jusqu'à ce qu'on n'ajoute
rien de nouveau.
ESPRIM Khouja Med Khairallah 260
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Exemple :
✓ Soit la grammaire suivante :
▪ E→E+T (1)
▪ E→T (2)
▪ T→T*F (3)
▪ T→F (4)
▪ F → (E) (5)
▪ F → nb (6)
ESPRIM Khouja Med Khairallah 261
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Exemple :
✓ Soit l'ensemble d'items I formé par :
▪ T → T*. F
▪ E → E.+T
✓ L’ensemble Fermeture(I) comprend :
▪ T → T*. F
▪ E → E.+T
▪ F → .nb
▪ F → .(E)
ESPRIM Khouja Med Khairallah 262
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Transition par X d'un ensemble d'items I :
✓ Noté par (I, X), c’est la fermeture de l’ensemble
formé par tous les items A → X. où A → .X
est dans I.
✓ Exemple :
▪ I = {T → T*.F, E → E.+T, F → .nb, F → .(E)}.
▪ On aura :
▪ (I, F) = { T → T*F.}
▪ (I, +) = {E → E+.T, T → .T*F, T → .F, F →.nb,
F → .(E)}.
ESPRIM Khouja Med Khairallah 263
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Collection des items d'une grammaire :
1. Rajouter l'axiome S’ avec la production S’ → S
2. Mettre dans l'item I0 la Fermeture de S’ → .S
3. Mettre I0 dans Collection
4. Pour chaque I dans Collection Faire :
Pour chaque X tel que (I, X) est non vide Faire:
Ajouter (I, X) dans Collection
5. Recommencer l’étape 3 jusqu'à ce qu'on n'ajoute
rien de nouveau.
ESPRIM Khouja Med Khairallah 264
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Construction de la table d'analyse SLR :
1. Construire la collection d'items {I0, ..., In}.
2. L'état « i » est construit à partir de Ii :
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
➢ Analyseur syntaxique SLR :
✓ On part dans l'état 0, et on empile et dépile non
seulement les symboles mais aussi les états
successifs.
✓ Exemple :
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
➢ Remarques sur l’analyse syntaxique SLR :
✓ Cette technique permet d'analyser plus de
grammaires que la méthode descendante (car il y
a plus de grammaires SLR que LL).
✓ En TP on va utiliser un outil (bison) qui construit
tout seul une table d'analyse LR (LALR en fait,
mais c'est presque pareil) à partir d'une
grammaire donnée.
ESPRIM Khouja Med Khairallah 271
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
Analyse syntaxique
ascendante
➢ Remarques sur l’analyse syntaxique SLR :
✓ Les grammaires ambiguës provoquent des
conflits :
▪ Conflit décalage/réduction : pas de décision à
la lecture du terminal a (faut-t-il réduire une
production S → ou décaler le terminal a?).
▪ Conflit réduction/réduction : on ne peut pas
décider à la lecture du terminal a s'il faut
réduire une production S → ou T → .
ESPRIM Khouja Med Khairallah 273
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Remarques sur l’analyse syntaxique SLR :
✓ On doit alors résoudre les conflits en donnant des
priorités aux actions (décaler ou réduire) et aux
productions.
✓ Exemple : soit la grammaire définie par les
productions :
▪ E → E + E | E * E | (E) | nb
Analyse syntaxique
ascendante
➢ Remarques sur l’analyse syntaxique SLR :
✓ Lorsqu'on lit le 2ième « + », on a le choix entre :
▪ Réduire ce qu'on a déjà lu par E → E + E; Ce
qui nous donnera finalement le calcul (3+4)+5.
▪ Décaler ce « + », ce qui nous donnera
finalement le calcul 3+(4+5).
✓ Ici on s'en cague car c'est pareil. Mais bon, «+
» est associatif à gauche, donc on préfèrera
réduire.
ESPRIM Khouja Med Khairallah 275
CH5. Analyse syntaxique
Analyse syntaxique
ascendante
➢ Remarques sur l’analyse syntaxique SLR :
✓ Soit à analyser « 3+4*5 ».
▪ Lorsqu'on lit le « * », on a encore un choix
« shift/reduce ».
▪ Si l'on réduit, on calcule (3+4)*5, et si on
décale, on calcule 3+(4*5)!
▪ On ne peut plus s'en foutre ! Il faut décaler.
Analyse syntaxique
ascendante