Académique Documents
Professionnel Documents
Culture Documents
ch2 Compilation PDF
ch2 Compilation PDF
2 L'ANALYSE SYNTAXIQUE
• 2.1 Le rôle de l’analyseur syntaxique
• 2.2 Les grammaires
• 2.3 L’analyse descendante
• 2.4 L’analyse ascendante
Traduction ch2 1
unité lexicale
programme analyseur analyseur arbre
source lexical (sur requête) syntaxique d’analyse
Traduction ch2 2
Types d’analyseurs syntaxiques :
• méthodes universelles (Cocke-Younger-Kasami),
permettent une analyse de n’importe quelle
grammaire algébrique, mais performance en O(n3) ;
• méthodes linéaires en O(n), sur certaines grammaires :
analyse ascendante, la plus intuitive, se prête bien à
certains types de traductions ;
analyse descendante, plus sophistiquée, la plus utilisée
par les générateurs automatiques d’analyseurs syntaxiques,
car ne nécessite que peu d’adaptations de la grammaire.
Exemples :
instr → si expr alors instr sinon instr
phrase → gsujet gverbe gcomplément
• Axiome (= programme)
E + E
6 nombre 2 nombre
Traduction ch2 5
E → EE + | EE – | EE * | EE / | nombre
Traduction ch2 6
Analyse syntaxique :
Étant donné un mot terminal, déterminer s’il est ou non engendré
par la grammaire ; si oui, en donner un arbre d’analyse.
Traduction ch2 7
Traduction ch2 9
PREMIER(x) SUIVANT(x)
Traduction ch2 11
Calcul de PREMIER :
On construit un graphe entre tous les symboles grammaticaux.
Flèche de x vers y ssi x → α yβ , et α est annulable.
Ici, α ne peut contenir que des variables, β est quelconque.
PREMIER(x) = { a terminal | il existe un chemin de x à a } ;
si x est annulable, il faut y ajouter ε.
Exemple de la grammaire précédente : Annulables : G et U
Graphe : A E T F ( G + U *
nombre
PREMIER(A) = PREMIER(E) = PREMIER(T) = PREMIER(F) = { (, nombre }
PREMIER(G) = {+, ε } PREMIER(U) = { *, ε }
Traduction ch2 12
Calcul de SUIVANT :
On construit un graphe entre tous les symboles grammaticaux.
Flèche de x vers y ssi ou bien
• il existe z → α xβ , y est terminal et y ∈ PREMIER(β) ;
• il existe y → α xβ et β est annulable.
Ici, α et β sont quelconques, même vides, et y ≠ ε.
SUIVANT(x) = { a terminal | il existe un chemin de x à a }.
Exemple de la grammaire précédente :
F *
Graphe : SUIVANT n’a pas de sens pour l’axiome
U T + A de la production augmentée.
SUIVANT(G) = SUIVANT(E) = { $, ) }
G E $ SUIVANT(U) = SUIVANT(T) = { +, $, ) }
SUIVANT(F) = { *, +, $, ) }
)
Traduction ch2 13
Traduction ch2 14
Table d’analyse LL(1) :
0A→ E$
+ * ( ) n $ 1E→ TG
E 1 1 2G→ +TG
G 2 3 3 3G→ ε
T 4 4 4T→ FU
U 6 5 6 6 5U→ *FU
6U→ ε
F 7 8
7F→ (E)
8F→ nombre
Les case vides de la table correspondent à des erreurs syntaxiques.
La table commande les branchements dans les procédures de
l’analyse par descente récursive.
On peut l’utiliser comme donnée d’un programme universel d’ana-
lyse descendante non récursive.
Traduction ch2 15
pile
Traduction ch2 16
Exemple : expressions arithmétiques
0A→ E$ PREMIER :
1E→ E +T
2E→ T A E T F (
3T→ T *F n
SUIVANT :
4T→ F
5F→ (E ) F T E $
6F→ n
+
* )
Traduction ch2 18
Fonctionnement de l’analyseur :
Au début, la pile contient l’état 0.
On lit la lettre courante du mot à analyser ; avec l’état du
sommet de pile, elle spécifie l’état à empiler (décalage).
Lorsqu’un état contient un item du type x → u •, on peut
enlever de la pile les |u| états au sommet, et empiler l’état
spécifié par le nouveau sommet et x (réduction).
Traduction ch2 19
Traduction ch2 20
Exemple : (3 + 2) * 4 $ Pile Mot restant Règle
027 4$
Pile Mot restant Règle
0275 $
0 2 7 10 $ F→ n
0 (3 + 2) * 4 $ T → T *F
02 $
04 3 + 2) * 4 $ E→ T
01 $
045 + 2) * 4 $ ACCEPTÉ
043 + 2) * 4 $ F→ n
042 + 2) * 4 $ T→ F
048 + 2) * 4 $ E→ T
0486 2) * 4 $ Dérivation obtenue :
04865 )*4$
04863 )*4$ F→ n E⇒ T ⇒ T *F ⇒ T * 4 ⇒ F * 4
04869 )*4$ T→ F ⇒ (E) * 4 ⇒ (E + T) * 4
048 )*4$ E → E +T ⇒ (E + F) * 4 ⇒ (E + 2) * 4
0 4 8 11 *4$ ⇒ (T + 2) * 4 ⇒ (F + 2) * 4
03 *4$ F → (E ) ⇒ (3 + 2) * 4
02 *4$ T→ F
Traduction ch2 21
Traduction ch2 22
Règle de propagation du contexte :
item x → u •yv (z) donnant par clôture y → •w (PREMIER(vz))
par transition x → uy •v (z)
On construit le graphe de dépendance des items. On établit alors
le contexte en suivant les flèches. Il peut y avoir des boucles.
état 0
A→ •E$ (ε)
E→ •E +T ($, +) état 2
E→ •T ($, +) T E→ T• ($, +)
T→ •T *F ($, +, *) T → T • *F ($, +, *)
T→ •F ($, +, *)
F→ •(E ) ($, +, *)
F→ •n ($, +, *) conflit levé
Utilisation de l’ambiguïté :
0A→ E$
1E→ E +E Grammaire ambiguë pour
2E→ E *E expressions arithmétiques
3E→ (E )
4E→ n SUIVANT(E ) = {$, +, *, )}
Traduction ch2 24
état 0 état 1 $ ACCEPTÉ état 6
A→ •E$ E A → E •$ E → E +E • +
état 3 3
E→ •E +E E → E •+E + E E → E •+E *
E→ 4
E→ •E *E E → E •*E E + •E E → E •*E
E→ •(E ) E→ •E +E
état 2 E→ (
E→ •n ( *
•E *E 2
E→ (•E ) E→ •(E ) n
9
n E→ •E +E E→ •n
( état 7
E→ •E *E état 4
état 9 E→ •(E ) E E → E *E • +
E→ E * •E 3
E→ n• E→ •n E → E •+E *
n E→ •E +E 4
E → E •*E
E→ •E *E
E (
E→ •(E ) 2
E→ •n n
9
état 5 état 8
) E → (E ) •
E → (E •)
E → E •+E +
3
E → E •*E *
4
Traduction ch2 25
Conflits décalage-réduction
état 6
E → E +E • Sur $, ), pas de conflit, réduire
E → E •+E Sur +, réduire car + associatif à gauche
E → E •*E Sur *, décaler car * prioritaire sur +
état 7
E → E *E • Sur $, ), pas de conflit, réduire
E → E •+E Sur +, réduire car * prioritaire sur +
E → E •*E Sur *, réduire car * associatif à gauche