Académique Documents
Professionnel Documents
Culture Documents
Olfa MOUELHI
olfa.mouelhi@esprit.tn
La syntaxe d’un langage peut être décrite par des grammaires non contextuelles (notation
BNF – Backus-Naur Form).
© Olfa Mouelhi
Rôle de l’analyseur syntaxique
Unité lexicale
Reste de la
Analyseur Analyseur Arbre d’analyse Représentation
Programme source partie
lexical Unité lexicale Syntaxique intermédiaire
frontale
suivante
Table de
symboles
© Olfa Mouelhi 3
Rôle de l’analyseur syntaxique
Deux types d’analyses sont retenues pour les compilateurs : Ascendante ou Descendante.
Analyseurs descendants construisent les arbres d’analyse de haut (ROOT) en bat (LEAF).
Dans les deux cas l’entrée de l’analyse syntaxique est explorée par convention de la gauche
vers la droite un symbole à la fois.
© Olfa Mouelhi 4
Grammaire non contextuelle
Permet d’exprimer des règles du type
Si S1 et S2 sont des Instructions et E une Expression alors :
« if E then S1 else S2 » est une instruction
© Olfa Mouelhi 5
Grammaire non contextuelle
Symboles terminaux : id + – * / ( )
Symboles non terminaux : expression et OP
© Olfa Mouelhi 6
Dérivation
E E E | E * E | ( E ) | - E | id (G1)
La production : E – E indique qu’une expression précédée du signe moins (–) est aussi une
expression.
Cette expression peut engendrer des expressions plus complexes à partir d’expressions plus
simples (remplacer une instance de E par – E).
E – E (Se lit E se dérive en – E)
© Olfa Mouelhi 7
Dérivation
E ( E ) : possibilité de remplacer une instance d’un E dans une chaîne de symboles
grammaticaux par (E) ; par exemple E * E (E) * E ou encore E * E E * (E).
On peut prendre un E unique et appliquer répétitivement les productions dans un ordre
quelconque :
E – E – (E) – (id)
On dit que A si :
A
et sont des chaînes arbitraires de symboles grammaticaux.
1 2 … n on dit que 1 se dérive en n
Le symbole veut dire dérivation en une étape.
Le symbole * veut dire dérivation en zéro, une ou plusieurs étapes.
* , une chaîne
Si * et alors * .
Le symbole +
veut dire dérivation en une ou plusieurs étapes.
© Olfa Mouelhi 8
Dérivation
Soit G une grammaire et S son axiome. L(G) est le langage engendré par G. Les chaînes de
L(G) contiennent uniquement les symboles terminaux de G. w une chaine de terminaux.
w L(G) S w.
+
w est phrase de G.
Un langage qui peut être engendré par une grammaire est dit langage non contextuel.
Deux grammaires qui engendrent le même langage sont dites équivalentes.
* , où peut contenir certains non terminaux, est une proto-phrase de G.
Si S
Une phrase de G est une proto-phrase de G ne contenant aucun non-terminal.
Exemple : la chaîne – (id + id) est une phrase de la grammaire G1 (page 7) car on a la
dérivation :
* – (id + id)
E
© Olfa Mouelhi 9
Dérivation
Bien que les deux dérivations aboutissent au même résultat, l’ordre n’est pas le même.
Considérons les dérivations dans lesquelles seuls le non-terminal les plus à gauche est
remplacé à chaque étape (dérivations gauches).
g
indique une étape de dérivation dans laquelle le non terminal le plus à gauche de a
été remplacé.
E
g
–E
g
– (E)
g
– (E + E)
g
– (id + E)
g
– (id + id)
g : se dérive en par une dérivation gauche.
*
© Olfa Mouelhi 10
Représentation graphique de Dérivation
E
Un arbre d’analyse peut représenter une dérivation (le choix
concernant l’ordre de remplacement ayant disparu). – E
Relation entre dérivation et arbre d’analyse:
( E )
E E E E E + E
– E – E – E
id id
( E ) ( E )
E + E
E E
– E – E
( E ) ( E )
E + E E + E
id id id
© Olfa Mouelhi 11
Représentation graphique de Dérivation
E E+E E E*E
id + E E+E*E
id + E * E id + E * E
id + id * E id + id * E
id + id * id id + id * id
E E
E + E E * E
id E * E E + E id
id id id id
© Olfa Mouelhi 12
Ambiguïté
Une grammaire qui produit plus d’un arbre d’analyse pour une phrase donnée est dite
ambiguë.
• Une grammaire ambiguë produit plus d’une dérivation à gauche ou plus d’une dérivation à
droite pour la même phrase.
• Il est généralement nécessaire de rendre la grammaire non ambigüe.
Exemple:
Cette grammaire est ambiguë car la chaîne w a plus d'une dérivation gauche:
Chaque construction décrite par une expression régulière peut être décrite par une
grammaire.
© Olfa Mouelhi 14
Transformation d’un AFN en grammaire
begin a b b
0 1 2 3
Une grammaire est récursive si elle contient un non terminal A qui se dérive en une
production contenant A.
Une production d’une grammaire est récursive à gauche si le symbole le plus à gauche de la
partie droite de la production est le même que le non terminal de la partie gauche de la
+
production (il existe une dérivation A A ( une chaîne quelconque).
Exemple : A A
Une production d’une grammaire est récursive à droite si le symbole le plus à droite de la
partie droite de la production est le même que le non terminal de la partie gauche de la
production.
Exemple : AA
© Olfa Mouelhi 16
Suppression de la récursivité à gauche
Les méthodes d’analyse descendante ne fonctionnent pas avec les grammaires récursives à
gauche.
L’analyseur par descente récursive peut boucler indéfiniment.
Pour les analyseurs descendants, il faut éliminer la récursivité à gauche.
Des règles de réécriture pour éliminer la récursivité à gauche.
A est non terminal dans les deux productions suivantes :
A A |
© Olfa Mouelhi 17
Suppression de la récursivité à gauche
immédiate
A A |
Application répétée de cette production :
© Olfa Mouelhi 18
Suppression de la récursivité à gauche
immédiate
E E+T|T
T T*F|F
F (E) | id
E T E’
Ê’ + T E’ |
T F T’
T’ * F T’ |
F (E) | id
© Olfa Mouelhi 19
Suppression de la récursivité à gauche
cachée
© Olfa Mouelhi 20
Suppression de la récursivité à gauche
cachée
BEGIN
Ordonner les non terminaux A1, A2, … , An;
FOR i 1 TO n DO
FOR j 1 TO i – 1 DO
remplacer chaque production de la forme Ai Aj par les productions
Ai 1 | 2 | … | k (Aj 1 | 2 | … | k sont des productions courantes)
END FOR
éliminer les récursivités immédiates des Ai-productions
END FOR
END
© Olfa Mouelhi 21
Suppression de la récursivité à gauche
cachée
Exemple :
S Aa | b
A Ac | Sd |
On classe les non terminaux dans l’ordre S, A
Il n’y a pas de récursivité à gauche immédiate dans les S-productions. Rien ne se produit
durant l’exécution de l’étape 2 pour i = 1.
Pour i = 2, on substitue les S-productions dans A Sd pour obtenir les A-productions
suivantes :
A Ac | Aad | bd |
En éliminant les récursivités à gauche immédiates, on obtient la grammaire suivante :
S Aa | b
A bdA’ | A’
A’ cA’ | adA’ |
© Olfa Mouelhi 22
Factorisation à gauche
© Olfa Mouelhi 23
Factorisation à gauche
Pour chaque non terminal A trouver le plus long préfixe au moins à deux de ses alternatives.
Si alors remplacer toutes les A-productions :
A 1 |2 | … | n |
Représente toutes les alternatives ne commençant pas par par :
A A’ |
A’ 1 | 2 | … | n
Répéter jusqu’à ce qu’aucune des alternatives d’un même non-terminal n’ait de préfixe commun.
© Olfa Mouelhi 24
Factorisation à gauche
Exemple :
S iEtSS’ | a S A’ |
S’ eS | A’ eS |
Eb
À la vue de i, S peut être développé en iEtSS’ et attendre jusqu’à ce que iEtS ait été reconnu
pour développer S’ en eS ou en
© Olfa Mouelhi 25
Analyse syntaxique descendante
Analyseurs prédictifs
Dans ce cas de figure, les mots clés if, while et begin nous prédisent quelle alternative est à
prendre pour développer l’instruction.
© Olfa Mouelhi 26
Analyse syntaxique descendante
Une pile contient une séquence de symboles grammaticaux avec le symbole $ marquant le
fond de la pile.
Utiliser une table d’analyse dans laquelle l’analyseur va chercher la production à appliquer
pour développer un non-terminal.
Utiliser un tampon d’entrée contenant la chaîne à analyser. Cette dernière se termine par un
marqueur de fin de chaîne ($).
Un flot de sortie.
Tampon d’entrée
a + b $
Programme
Pile explicite
© Olfa Mouelhi
Analyse syntaxique descendante
Tableau d’analyse à deux dimensions M[A, a], A est non-terminal, a est terminal ou $.
Initialement la pile contient l’axiome de la grammaire au dessus du symbole $.
X est le symbole au sommet de la pile et a le symbole d’entrée courant déterminent l’action
de l’analyseur. Trois possibilités :
Si X = a = $, Arrêt de l’analyseur et fin réussi de l’analyse.
Si X = a $, l’analyseur enlève X de la pile et avance son pointeur vers le symbole suivant.
Si X est un non-terminal, le programme consulte l’entrée M[X, a] de la table d’analyse M qui est
soit une X-production soit une erreur.
Si X-production, remplacer X au sommet de la pile par la X-production (*).
Si erreur, appeler la procédure de récupération sur erreur.
© Olfa Mouelhi 28
Analyse syntaxique descendante
© Olfa Mouelhi 29
Analyse syntaxique descendante
© Olfa Mouelhi 30
Analyse syntaxique descendante
Deux fonctions Premier et Suivant, associées à une grammaire G, permettent de remplir les
entrées de la table d’analyse prédictive pour G.
: Si est une chaîne de symboles grammaticaux, Premier () désigne l’ensemble* des
Premier
terminaux qui commencent par les chaînes qui se dérivent de . Si , alors est aussi
dans Premier ().
: Pour chaque non terminal A, Suivant (A) est l’ensemble de terminaux a qui peuvent
Suivant
apparaître immédiatement à droite de A. C’est-à-dire qu’il existe une dérivation de la forme
S Aa* où et sont des chaînes de symboles grammaticaux.
© Olfa Mouelhi 31
Analyse syntaxique descendante
Remarque:
© Olfa Mouelhi 32
Analyse syntaxique descendante
E T E’
E’ + T E’ |
T F T’
T’ * F T’ |
F (E) | id
© Olfa Mouelhi 33
Analyse syntaxique descendante
Mettre $ dans Suivant (S) où S est l’axiome et $ est la marqueur de fin du texte source.
S’il y a une production A B, ajouter le contenu de Premier () à Suivant (B) exception
faite de .
© Olfa Mouelhi 34
Analyse syntaxique descendante
Exemple de calcul de Suivant (X)
E T E’
E’ + T E’ |
T F T’
T’ * F T’ |
F (E) | id
© Olfa Mouelhi 35
Analyse syntaxique descendante
Construction des table d’analyseurs prédictifs
© Olfa Mouelhi 36
Analyse syntaxique descendante
Exemple de construction de table prédictive
Symbole d’entrée
E T E’ Non-terminal
id + * ( ) $
Ê’ + T E’ |
E E TE’ E TE’
T
F T’
La production E’ +TE’ implique
E’ que l’entréeE’M[E’, +TE’.
+TE’+] prend la valeur E’ E’ E’
T’
* F T’ | E’ impliqueT que lesT
La production FT’
entrées FT’
M[E’, )] et M[E’,T $] prennent tous les deux
F
la valeur
(E) |E’id car Suivant (E’)
T’ = {), $} T’ T’ * FT’ T’ T’
F F id F (E)
© Olfa Mouelhi 37
Analyse syntaxique descendante
© Olfa Mouelhi 38
Grammaire LL(1)
Définition
Pour certaines grammaires, la table M peut avoir des entrées définies de façon multiple.
La grammaire dont la table d’analyse n’a aucune entrée définie de façon multiple est dite
LL(1).
L : « Left to right scanning » (parcours de l’entrée de gauche vers l’entrée de droite), L : «
Leftmost derivation » (dérivation à gauche), 1 : On utilise un seul symbole d’entrée de
prévision à chaque étape nécessitant la prise d’une décision d’action d’analyse.
Une grammaire est LL(1)
factorisée
Non récursive à gauche
Non ambigüe
© Olfa Mouelhi 39
Analyse syntaxique Ascendante
Construire un arbre d'analyse pour une chaîne source en commençant par les feuilles.
Peut être considérée comme la réduction d'une chaîne w vers l'axiome de la grammaire.
© Olfa Mouelhi 40
Analyse syntaxique Ascendante
Exemple
S aSbS | c
Entrée : le mot u = aacbaacbcbcbacbc
aacbaacbcbcbacbc on ne peut rien réduire, donc on décale. aaSbSbacbc on peut réduire S aSbS
aacbaacbcbcbacbc on ne peut rien réduire, donc on décale. aSbacbc on ne peut rien réduire, donc on décale.
aacbaacbcbcbacbc on peut réduire S c aSbacbc on ne peut rien réduire, donc on décale.
aaSbaacbcbcbacbc on ne peut rien réduire, donc on décale aSbacbc on ne peut rien réduire, donc on décale
aaSbaacbcbcbacbc on ne peut rien réduire, donc on décale aSbacbc on peut réduire S c
aaSbaacbcbcbacbc on ne peut rien réduire, donc on décale aSbaSbc on peut réduire S c
aaSbaacbcbcbacbc on ne peut rien réduire, donc on décale aSbaSbc on ne peut rien réduire, donc on décale
aaSbaacbcbcbacbc on peut réduire S c aSbaSbc on peut réduire S c
aaSbaaSbcbcbacbc on ne peut rien réduire, donc on décale aSbaSbS on peut réduire S aSbS
aaSbaaSbcbcbacbc on ne peut rien réduire, donc on décale aSbS on peut réduire S aSbS
aaSbaaSbcbcbacbc on peut réduire S c S Terminé
aaSbaaSbSbcbacbc on peut réduire S aSbS
aaSbaSbcbacbc on ne peut rien réduire, donc on décale
aaSbaSbcbacbc on ne peut rien réduire, donc on décale
aaSbaSbcbacbc on peut réduire S c
aaSbaSbSbacbc on peut réduire S aSbS
© Olfa Mouelhi 41
Analyse syntaxique Ascendante
Exemple
a a c b a a c b c b c b a c b c
S S S S S S
S S
S
© Olfa Mouelhi 42
Analyseurs LR
© Olfa Mouelhi 43
Analyseurs LR
Modèle d’analyseur LR
Tampon d’entrée
a1 a2 … ai … an $
Pile
Programme
sm Flot de sortie
d’analyse LR
Xm
sm - 1
Xm - 1
… Action Successeur
s0
© Olfa Mouelhi 44
Analyseurs LR
Modèle d’analyseur LR
45
© Olfa Mouelhi
Analyseurs LR
Algorithme d’analyse LR
© Olfa Mouelhi 46
Analyseurs LR
Algorithme d’analyse LR
Configuration d’un analyseur LR: un couple dont le premier composant est le contenu de la
pile et dont le second composant est la chaîne d’entrée restant à analyser.
© Olfa Mouelhi 47
Analyseurs LR
Algorithme d’analyse LR
Action décaler
Si Action [sm, ai] = décaler s, l’analyseur exécute une action décaler, atteignant la configuration :
(s0 X1 s1 X2 s2 … Xm sm ai s, ai+1 … an $)
L’analyseur a à la fois empilé le symbole d’entrée courant ai et le prochain état s qui est donné
par Action [sm, ai] ; ai+1 devient le symbole d’entrée courant.
© Olfa Mouelhi 48
Analyseurs LR
Algorithme d’analyse LR
Action réduire
Si Action [sm, ai] = réduire par A , alors l’analyseur exécute une action réduire atteignant la
configuration suivante :
© Olfa Mouelhi 49
Analyseurs LR
Algorithme d’analyse LR
Action Accepter
Action Erreur
Si Action [sm, ai] = erreur, l’analyseur a découvert une erreur et appelle une routine de
récupération sur erreur.
© Olfa Mouelhi 50