Académique Documents
Professionnel Documents
Culture Documents
La syntaxe d’un langage peut être décrite par des grammaires non contextuelles (notation
BNF – Backus-Naur Form).
Unité lexicale
Reste de la
Analyseur Analyseur Arbre d’analyse
partie
Représentation
Programme source lexical Syntaxique
Unité lexicale frontale intermédiaire
suivante
Table de
symboles
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.
4
Analyse descendante
Analyse descendante
5
récursivité à gauche et à droite
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 : A→αA
6
la récursivité à gauche
Vt = {α , β }
Exemple : A → Aα | β Vn = { A}
Axiôme = A
A
A α
A α
A α
A α
7
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α | β
8
Suppression de la récursivité à gauche
immédiate
A → Aα | β
Application répétée de cette production :
9
Suppression de la récursivité à gauche
immédiate
10
Exercice
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
11
Factorisation à gauche
A → αA’
A’ → β1 | β2
12
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.
13
Factorisation à gauche
Exemple
S → iEtSS’ | a S → αA’ | γ
S’ → eS | ε A’ → eS | ε
E→b
À 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 ε
14
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.
15
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
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.
17
Analyse syntaxique descendante
18
Analyse syntaxique descendante
19
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 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.
20
Analyse syntaxique descendante
21
Analyse syntaxique descendante
E → T E’
E’ → + T E’ | ε
T → F T’
T’ → * F T’ | ε
F → (E) | id
22
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 ε.
23
Analyse syntaxique descendante
Exemple de calcul de Suivant (X)
E → T E’
E’ → + T E’ | ε
T → F T’
T’ → * F T’ | ε
F → (E) | id
24
Analyse syntaxique descendante
Construction des table d’analyseurs prédictifs
25
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
→
La production
F T’ E’ → +TE’ implique
E’ que l’entrée M[E’,
E’ → +TE’+] prend la →→+TE’.
valeur E’ E’ ε E’ → ε
T’
→ * F T’ | ε E’ → ε impliqueT que lesT →
La production entrées
FT’ M[E’, )] et M[E’,T $]→ FT’
prennent tous les deux
F →
la valeur
(E) |E’id→ ε car Suivant (E’)
T’ = {), $} T’ → ε T’ → * FT’ T’ → ε T’ → ε
F F → id F → (E)
26
Analyse syntaxique descendante
© Olfa Mouelhi 27
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
28
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.
29
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 aSbaSbcc 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
30
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
31
Analyseurs LR
32
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
33
Analyseurs LR
Modèle d’analyseur LR
34
Analyseurs LR
Algorithme d’analyse LR
35
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.
36
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.
37
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 :
38
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.
39