chp3 PDF
chp3 PDF
chp3 PDF
syntaxique
Enseignant: Manel Ben Salem
2022-2023
1
Plan des cours Techniques de compilation
Chapitre 3 : Analyse syntaxique 2
1. Introduction
2. Représentations de la grammaire
3. Rôle d'un analyseur syntaxique
4. Approches d'analyse syntaxique
5. Analyse descendante LL
6. Analyse ascendante LR
1. Introduction Techniques de compilation
Chapitre 3 : Analyse syntaxique 3
• Tout langage possède des règles indiquant la structure syntaxique d'une phrase bien formée.
• La syntaxe d'un langage peut être décrite par une grammaire.
• L'analyseur syntaxique reçoit une suite d'unités lexicales de la part de l'analyseur lexical. Il doit
vérifier que cette suite peut être engendrée par la grammaire du langage.
• Le principe est d'essayer de construire un arbre de dérivation.
• Il existe deux méthodes pour cette construction:
✓ Méthode d'analyse descendante LL.
✓ Méthode d'analyse ascendante LR.
2. Représentations de la grammaire Techniques de compilation
Chapitre 3 : Analyse syntaxique 4
A part les règles de production, il est possible de définir une grammaire en utilisant des notations textuelles
comme la forme BNF ou EBNF ou des représentations graphiques telles que les diagrammes syntaxiques.
Exemple :
<List Inst> ::= <List Inst>;<Inst>|<Inst>
<Inst> ::= id ::= <Exp>|if <Exp> then <Inst>|if <Exp> then <Inst> else <Inst>
Exemple :
<List Inst> ::= <Inst>{;<Inst>}
<Inst> ::= id ::= <Exp>|if <Exp> then <Inst>[else <Inst>]
• L'analyseur syntaxique (parser en anglais) permet d'analyser des séquences d'unités lexicales obtenus
par l'analyseur lexical conformément à la grammaire engendrant le langage considéré.
• Il reconnait la structure syntaxique du programme source et produit une représentation sous forme
d'un arbre syntaxique.
• Ainsi les fonctions principales d'un analyseur syntaxique sont:
✓ L'analyse de la chaine d'unités lexicales délivrée par l'analyseur lexical pour vérifier si cette chaine
peut être engendrée par la grammaire du langage en question.
✓ La détection des erreurs syntaxiques si la syntaxe du langage n'était pas respectée.
✓ La construction éventuelle d'une représentation interne qui sera utilisée par les phases ultérieurs..
4. Approches d'analyse syntaxique Techniques de compilation
Chapitre 3 : Analyse syntaxique 8
• Les méthodes ascendantes et descendantes sont fréquemment utilisées pour la réalisation des compilateurs.
• L'analyseur syntaxique parcoure la suite d''unités lexicales en entrée, pour une analyse ascendante ou
descendante, symbole par symbole de la gauche à droite.
• Les méthodes les plus efficaces fonctionnent uniquement avec des sous classes de grammaires telles que
les grammaires LL et LR qui sont suffisamment expressives pour décrire la majorité des structures
syntaxiques des langages de programmation.
• Les analyseurs syntaxiques mis en œuvre manuellement utilisent généralement des méthodes descendantes et
des grammaires LL.
• Les méthodes ascendantes sont souvent utilisées par les outils de construction des analyseurs syntaxiques
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 11
Principe :
Construire l'arbre de dérivation du haut (la racine : axiome L : Le mot est lu de gauche à droit ("Left to
regarde à chaque étape un seul symbole dans l'arbre ("leftmost derivation" en anglais)
d c
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 12
Exemples :
Soit la grammaire G=(T, N, S, R) avec T={a, b, c, d}, N={S, A}, R={S→ aAb ; A→ cd|c}. Avec l'entrée acb on
peut construire l'arbre de dérivation suivante: S
a A b
cd | c
Pour construire une table d'analyse LL(1), on aura besoin des ensembles PREMIER et SUIVANT.
1. Si X est un non terminal et X→ Y1Y2 ... Yn est une production de la grammaire (avec Yi symbole terminal ou
non terminal), alors:
• Ajouter les éléments de PREMIER (Y1) sauf ε à PREMIER (X).
• S'il existe j (j ∈{2, …, n}) tel que pour tout i=1,…, j-1 on ε ∈ PREMIER(Yi) alors ajouter les éléments de
PREMIER (Yj) sauf ε à PREMIER (X).
• Si pour tout i =1, …, n , ε ∈ PREMIER (Yi) alors ajouter ε à PREMIER(α).
2. Si X est non terminal et x→ε est une production ajouter ε à PREMIER (X).
3. Si X est un terminal, alors PREMIER (X)=X.
4. Recommencer jusqu'à ce qu'on n'ajoute rien de nouveau dans les ensembles PREMIER.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 15
1. Ajouter un marqueur de fin de chaine ($) à SUIVANT (S) (où S est l’axiome de départ de la grammaire).
2. S’il y a une production A → αBβ où B est un non terminal, alors ajouter le contenu de PREMIER (β) à
SUIVANT (B) sauf ε.
3. S’il y a une production A → αB, alors ajouter le contenu de SUIVANT (A) à SUIVANT (B).
4. S’il y a une production A → αBβ avec ε appartient à PREMIER (β), alors ajouter le contenu de à SUIVANT
(A) à SUIVANT (B).
5. Recommencer à partir de 3 jusqu’à ce qu’on n’ajoute rien de nouveau dans les ensembles SUIVANT.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 17
nb + * ( ) $
E E→ TE' E→ TE'
E' E'→+TE' E'→ε E'→ε
T T→ FT' T→ FT'
T' T'→ε T'→*FT' T'→ε T'→ε
F F→nb F→(E)
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 20
Définition :
On appelle grammaire LL(1), une grammaire pour laquelle la table d'analyse LL(1) n'a aucune case définie
de façon multiple.
Théorème :
Une grammaire ambigüe, récursive à gauche ou non factorisée à gauche n'est pas LL(1).
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 23
Définition :
Une grammaire est immédiatement récursive à gauche si elle contient un non terminal A tel qu'il existe une
production A→ Aα, où α est une chaine quelconque.
Exemple :
Soit la grammaire G=(T, N, S, R) avec T={a, b, c, d, e}, N={S, A, B}, R={S→ ScA|B ; A→Aa|ε ; B→ Bb|d|e }.
Cette grammaire contient plusieurs récursivités immédiates à gauche.
Elimination de la récursivité à gauche immédiate :
Remplacer toute règle de la forme A→ Aα|β par les deux règles :
A→ βA'
A'→ αA'|ε
Théorème : La grammaire ainsi obtenue reconnait le même langage que la grammaire initiale.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 24
Définition :
+
Une grammaire est récursive à gauche si elle contient un non terminal A tel qu'il existe une production A→
Aα, où α est une chaine quelconque.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 25
Théorème : La grammaire ainsi obtenue reconnait le même langage que la grammaire initiale.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 26
Pour chaque non terminal A, trouver le plus long préfixe α commun à deux de ses alternatives ou plus
Si α différent ε alors
Remplacer chaque production de la forme A→αβ1|αβ2|…|αBp|µ1|µ2|…|µp (où µi ne commencent
pas par α) par les deux règles :
A→αA'|µ1|µ2|…|µp
A'→β1|β2|…|βp
Fin Si
Fin Pour
Recommencer jusqu'à ne plus trouver des préfixes α.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 28
5.7 Conclusion
5.7 Conclusion
Exemple :
; F→ (E)|nb }.
T F
Après suppression de la récursivité gauche immédiate, on obtient :
G=(A, N, E, R) avec A={*, +, (, ), nb}, N={E, E', T, T', F} et nb
T * F
R={E→ TE' ; E'→ +TE'|ε ; T→ FT' ; T'→ *FT'|ε ; F→ (E)|nb }.
F nb
Pas de factorisation à gauche. Cette grammaire est LL(1).
nb
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 31
Un analyseur syntaxique ascendant (bottom-up) crée une déviation à partir des symboles terminaux en
remontant vers le symbole initial.
Principe :
Construire un arbre de dérivation du bas (les feuilles : unités lexicales) vers le haut (la racine : l'axiome de départ).
6.1 Analyse LR (0)
Pour construire une table d'analyse LR (0), on utilise des fermetures d'items. Un item est une production de
la grammaire avec "." dans la partie droite. Par exemple : E→E.+T
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 33
Algorithme
Δ(I, X) = Fermeture (tous les items A→αX.β), où A→α.Xβ est dans I et X est l'ensemble des terminaux et des non
terminaux de la grammaire sauf S' (S'→S$).
Exemple :
Sur l'exemple précédant soit I={E→E+.T}, on aura :
Δ(I, T) ={E→E+T.}
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 35
Remarques: Si l'analyseur est dans un état dans lequel il y a un seul item de la forme A→α., alors il ne peut
que réduire par la règle A→α
Si l'analyseur est dans un état ne contenant pas d'items de la forme A→α., alors il ne peut que décaler
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 40
7 D6 D9
T
8 R2 R2 R2 R2 R2
9 R5 R5 R5 R5 R5 8
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 41
42