Vous êtes sur la page 1sur 42

Chapitre 3: Analyse

syntaxique
Enseignant: Manel Ben Salem

Niveau: 2ième Licence SI

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.

2.1 La notation BNF


• La notation BNF (Backus-Naur-Form) est due aux créateurs de Fortran (J.Backus, 1955) et Algol (P.Naur,
1963). Les règles suivent les conventions suivantes :
✓ Un symbole A non terminal est noté par <A> ou A (lettres majuscules).
✓ Un symbole a terminal est noté sans <> ou a (lettres minuscules).
✓ Le signe → devient ::=
✓ Un ensemble de règles A→α, A→β, …, A→µ sera remplacé par A→α|β|…|µ
Exemple :
<Bloc> ::= Begin <List Opt Inst> End.
<List Opt Inst> ::=<List Inst>|ε
2. Représentations de la grammaire Techniques de compilation
Chapitre 3 : Analyse syntaxique 5

Exemple :
<List Inst> ::= <List Inst>;<Inst>|<Inst>
<Inst> ::= id ::= <Exp>|if <Exp> then <Inst>|if <Exp> then <Inst> else <Inst>

2.2 La notation EBNF


• La notation EBNF (Extended Backus-Naur-Form) est une représentation plus réduite que celle de la
notation BNF en utilisant les signes [] et {}.
• .Les conventions suivantes doivent être prises en compte:
✓ Une partie optionnelle est notée entre [] (apparaît 0 ou 1 fois).
✓ Une partie qui peut apparaitre de façon répétée est notée entre {} (apparaît 0 ou N fois).
✓ Les parenthèses sont facultatives mais ils peuvent être utilisées pour éviter les ambiguïtés.
Exemple :
<Bloc> ::= Begin [<List Inst>] End.
2. Représentations de la grammaire Techniques de compilation
Chapitre 3 : Analyse syntaxique 6

Exemple :
<List Inst> ::= <Inst>{;<Inst>}
<Inst> ::= id ::= <Exp>|if <Exp> then <Inst>[else <Inst>]

2.3 Les diagrammes syntaxiques


• Un diagramme syntaxique est
Begi
une représentation graphique n
End .

des règles du langage. Inst


✓ Un terminal est ;
encerclé. Id ::= Exp
✓ Un non terminal est The
if Exp Inst
encadré. n

Exemple : else Inst


3. Rôle d'un analyseur syntaxique Techniques de compilation
Chapitre 3 : Analyse syntaxique 7

• 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

• Il existe trois catégories de méthodes d'analyse syntaxique :


✓ Les méthodes universelles : qui sont généralement tabulaires comme celles de Cocke-Younger-
Kasami (1965-1967) et de Earley (1970) et qui peuvent analyser une grammaire quelconque.
Cependant, ces méthodes perdent leur efficacité pour les compilateurs industriels.
✓ Les méthodes descendantes (Top-Down) : qui construisent des arbres d'analyse de haut en bas (de la
racine aux feuilles).
✓ Les méthodes ascendantes (Bottom-up) : qui construisent des arbres d'analyse de bas en haut
(remontent des feuilles vers la racine.
Exemple :
Soit la grammaire G=(T, N, S, R) avec T={a, b, (, ), =, +}, N={S, B, R, E} et R={ S → B, B → R|(B), R →
E=E, E → a|b|(E+E)}
4. Approches d'analyse syntaxique Techniques de compilation
Chapitre 3 : Analyse syntaxique 9

Exemple : L'analyse de la chaîne (a=(b+a)) par une approche


L'analyse de la chaîne (a=(b+a)) par une approche ascendante débute au niveau de la chaine (lire du bas en
descendante débute par l'axiome et s'effectue par haut) et remplace à chaque étape, une partie de la chaine
dérivations successives (à partir de la gauche) par un non-terminal par réductions successives (à partir de
comme suit: la gauche) comme suit:
S→B S
→ (B) B
→ (R) (B)
→ (E=E) (R)
→ (a=E) (E=E)
→ (a=(E=E)) (E=(E+E))
→ (a=(b+E)) (E=(E=a))
→ (a=(b+a)) (E=(b+a))
(a=(b+a))
4. Approches d'analyse syntaxique Techniques de compilation
Chapitre 3 : Analyse syntaxique 10

• 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

de départ) vers le bas (les feuilles : unités lexicales). right" en anglais)

L'analyseur commence par l'axiome de la grammaire, il L : On construit une dérivation gauche

regarde à chaque étape un seul symbole dans l'arbre ("leftmost derivation" en anglais)

construite, le plus à gauche non encore traité. S


Exemples :
a S b T
Soit la grammaire G=(A, N, S, R) avec A={a, b, c, d}, N={S,
T}, R={S→ aSbT|cT|d T→ aT|bS|c}. Avec l'entrée c T b S
accbbadbc on peut construire l'arbre de dérivation suivante
a T
donc le mot appartient au langage. c S b

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

• En lisant le c, on ne sait pas s'il faut prendre la règle A→ cd ou la règle A→ c,


• Pour confirmer le choix de la règle à appliquer il faut lire aussi le symbole suivant b ou il faut se donner la
possibilité de faire des retours en arrière : on essaye la première règle A→ cd on aboutit à un échec alors on
retourne en arrière et on essaye la deuxième règle.
→ Afin de résoudre le problème précédant on utilise une table d'analyse LL (1).
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 13

5.1 Table d'analyse LL (1)

1 : un seul symbole lu à l'avance

Pour construire une table d'analyse LL(1), on aura besoin des ensembles PREMIER et SUIVANT.

5.1.1 Calcul des ensembles PREMIER

• Pour toute chaine α composée de terminaux et non terminaux, on cherche PREMIER de α.


• L'ensemble α est l'ensemble de tous les terminaux qui peuvent commencer une chaine qui se dérive de α.
* aβ (β étant une chaine quelconque composée de
• On cherche tous les terminaux a tel qu'il existe une dérivation α→
terminaux et de non terminaux).

Algorithme de construction des ensembles PREMIER


5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 14

5.1 Table d'analyse LL (1)


5.1.1 Calcul des ensembles PREMIER
Algorithme de construction des ensembles PREMIER

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

5.1 Table d'analyse LL (1)


5.1.1 Calcul des ensembles PREMIER
Exemple :
Soit la grammaire G=(A, N, E, R) avec A={+, -, (, ), nb}, N={E, E', T, T', F}, R={E→ TE' ; E'→+TE'|ε ; T→ FT'
; T'→*FT'|ε ; F→(E)|nb}.
Ajouter PREMIER(T) sauf ε à PREMIER(E)
Ajouter + à PREMIER (E') Non terminal α PREMIER (α)
Ajouter ε à PREMIER (E') E {(, nb}
E' {+, ε}
Ajouter PREMIER (F) sauf ε à PREMIER (T)
T {(, nb}
Ajouter * à PREMIER (T')
T' {*, ε}
Ajouter ε à PREMIER (T') F {(, nb}
Ajouter ( à PREMIER (F)
Ajouter nb à PREMIER (F)
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 16

5.1 Table d'analyse LL (1)


5.1.2 Calcul des ensembles SUIVANT
Pour tout non terminal A, on cherche SUIVANT de A : l'ensemble de tous les symboles terminaux a qui peuvent
* αAaβ.
apparaître immédiatement à droite de A dans un dérivation S→

Algorithme de construction des ensembles SUIVANT

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

5.1 Table d'analyse LL (1)


5.1.2 Calcul des ensembles SUIVANT
Exemple :
Soit la grammaire G=(A, N, E, R) avec A={+, -, (, ), nb}, N={E, E', T, T', F}, R={E→ TE' ; E'→+TE'|ε ; T→ FT'
; T'→*FT'|ε ; F→(E)|nb}.
1. Ajouter $ à SUIVANT(E) Non terminal α SUIVANT (α)
2. Ajouter PREMIER (E') sauf ε à SUIVANT (T) E {$, )}

Ajouter PREMIER (F) sauf ε à SUIVANT (F) E' {$, )}


T {+, $, )}
Ajouter PREMIER ) à SUIVANT (E)
T' {+, $, )}
3. Ajouter SUIVANT (E) à SUIVANT (E']
F {*, +, $, )}
Ajouter SUIVANT (T) à SUIVANT(T')
4. ε ∈ PREMIER (E') alors ajouter SUIVANT (E) à SUIVANT (T) et SUIVANT (E') à SUIVANT (T)
ε ∈ PREMIER (T') alors ajouter SUIVANT (T) à SUIVANT (F) et SUIVANT (T') à SUIVANT (F)
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 18

5.1 Table d'analyse LL (1)


5.1.3 Construction de la table d'analyse LL(1)
Une table d'analyse est un tableau M à deux dimensions. Elle indique pour chaque symbole non terminal A et chaque
symbole terminal a ou symbole $ (fin de l'entrée) la règle de production à appliquer.

Algorithme de construction de la table d'analyse LL(1)

Pour Chaque production A → α faire


1. Pour tout a appartient à PREMIER (α) (avec a différent de ε), rajouter la production A → α dans la
case M (A, a).
2. Si ε appartient à PREMIER (α) alors, pour chaque b appartenant à SUIVANT (A), ajouter A → α
dans la case M (A, b).
Si on accède à une case M (A, α) vide, on obtient une erreur de syntaxe.
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 19

5.1 Table d'analyse LL (1)


5.1.3 Construction de la table d'analyse LL(1)
Exemple :
Soit la grammaire G=(A, N, E, R) avec A={+, -, (, ), nb}, N={E, E', T, T', F}, R={E→ TE' ; E'→+TE'|ε ; T→ FT'
; T'→*FT'|ε ; F→(E)|nb}.

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

5.2 Analyse syntaxique


* m. On utilise pour cela une pile
On cherche à déterminer si un mot m donné est tel que S→
Algorithme
Données : mot m, table d'analyse M Sinon erreur Avancer ps
Initialisation de la pile avec $S Fin Si Sinon erreur
Un pointeur ps pointe sur la première lettre de m. Sinon Fin Si
Répéter Si X=$ alors Fin Si
Soit X le symbole en sommet de pile Si a=$ alors accepter Fin Si
Soit a la lettre pointée par ps Sinon erreur Jusqu'à erreur ou accepter
Si X est non terminal alors Fin Si
Si M(X,a)=X→ Y1Y2 ... Yn alors Sinon
Mettre YnYn-1 ... Y1 dans la pile Si X=a alors
Enlever X de la pile
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 21
Pile Entrée Sortie
5.2 Analyse syntaxique $E 3+4*5$ E→ TE'
$E'T 3+4*5$ T→ FT'
Exemple : $E'T'F 3+4*5$ F→ nb

Soit le mot : 3+4*5$ $E'T'nb 3+4*5$


$E'T' +4*5$ T'→ε
$E' +4*5$ E'→+TE'
$E'T+ +4*5$
$E'T 4*5$ T→ FT'
$E'T'F 4*5$ F→ nb
$E'T'nb 4*5$
$E'T' *5$ T'→*FT'
$E'T'F* *5$
$E'T'F 5$ F→ nb
$E'T'nb 5$
$E'T' $ T'→ε
$E' $ E'→ε
$ $ Accepter
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 22

5.3 Grammaire LL(1)


Si la table d'analyse comporte des entrées multiples (plusieurs productions dans une même case M(A, a)), on ne
pourra pas faire une telle analyse descendante vu qu'on ne pourra pas savoir quelle production appliquer.

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

5.4 Récursivité à gauche

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

5.4 Récursivité à gauche


Exemple :
Sur l'exemple précédant on obtient la grammaire non immédiatement récursive à gauche suivante : G=(T, N, S, R)
avec T={a, b, c, d, e}, N={S, S', A, A', B, B'},
R={S→ BS' ;
S' → S'cA|ε ;
A→A' ;
+
A'→ aA'|ε ;
B→(d|e )B' ;
B'→bB'|ε}.

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

5.4 Récursivité à gauche


Elimination de la récursivité à gauche :
Ordonner les non terminaux A1, A2, …, An
Pour i=1 à n faire
Pour j=1 à i-1 faire
Remplacer chaque production de la forme Ai→Aj α où Aj→β1|β2|…|Bp par Ai=β1α|β2α|…|Bpα
Fin Pour
Eliminer les récursivités à gauche immédiates des productions Ai
Fin Pour

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

5.4 Récursivité à gauche


β α
Exemple :
Soit la grammaire G=(T, N, S, R) avec T={a, b, c, d}, N={S, A}, R={S→ Aa|b ; A→Ac|Sd|c }.
On ordonne S (A1), A (A2) (n=2).
i=1 ; Pas de récursivité immédiate dans S→ Aa|b
i=2 ; j=1 ; on obtient A→ Ac|c|Aa d|b d
On élimine la récursivité gauche immédiate :
A→ Ac|Aad)|bd|c
A→ bd A'|cA'
A'→ cA'|adA'|ε
On obtient les règles de dérivations de la grammaire suivantes:
S→ Aa|b ; A→ bd A'|cA' ; A'→ cA'|adA'|ε
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 27

5.6 Factorisation à gauche


Algorithme

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.6 Factorisation à gauche


α
Exemple :
Soit la grammaire G=(T, N, S, R) avec T={a, b, c, e}, N={S, E, B}, R={S→ aEbS|aEbSeB|a ; E→bcB| bca ;
B→ba }.
On obtient : On obtient :
S→ aEbSS'|a S→ aS''
S'→ eB|ε S''→ EbSS'|ε
E→bcE' S'→ eB|ε
E'→B|a E→bcE'
B→ba E'→B|a
B→ba
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 29

5.7 Conclusion

Pour s'assurer qu'une grammaire est LL(1), il faut :


1. Rendre la grammaire non ambigüe si nécessaire (il n'y a pas de méthode vu qu'une grammaire ambigüe est une
grammaire mal conçue).
2. Éliminer la récursivité à gauche, si nécessaire.
3. La Factoriser à gauche, si nécessaire.
4. Construire la table d'analyse.
Exemple :
E E
Soit la grammaire des expressions arithmétiques G=(A, N, E, R)
E + E E * E
avec A={*, +, (, ), nb}, N={E}, R={E→ E+E|E*E|(E)|nb }.
Cette grammaire est ambigüe vu que l'expression 5*4+3 peut être nb nb
E * E E + E
connue par deux arbres syntaxiques différents.
nb nb nb nb
5. Analyse descendante LL Techniques de compilation
Chapitre 3 : Analyse syntaxique 30

5.7 Conclusion
Exemple :

Pour lever l'ambiguïté, on considère les priorités classiques des


E
opérateurs et on obtient la grammaire non ambigüe G=(A, N, E, R)
avec A={*, +, (, ), nb}, N={E, T, F} et R={E→ E+T|T ; T→ T*F|F E + T

; 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)

L : Le mot est lu de gauche à droit ("Left to right" en anglais)


R : On construit une dérivation gauche ("Rightmost derivation" en anglais)
LR(0) : analyse syntaxique ascendante où le 0 signifie 0 symbole lu en avance

6.1.1 Table d'analyse LR (0)


La table d'analyse LR(0) est un automate à pile.
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 32

6.1 Analyse LR (0)


6.1.1 Table d'analyse LR (0)
Elle permet d'indique ce qu'il faut faire lorsqu'on lit un symbole a on est dans un état i, soit:
• On décale: On empile le symbole lu, sauf $, et on va dans un autre état j. Cette opération est notée dj.
• On réduit par la règle de production numéro p : On remplace la chaine 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épond du non terminal en question. On note cette opération rp.
• On accepte le mot (état final)
• On affiche une erreur (une case vide de la table d'analyse LR (0)).

6.1.2 Fermeture d'un ensemble d'items I

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

6.1 Analyse LR (0)


6.1.2 Fermeture d'un ensemble d'items I
Le point dans la partie droite de la règle indique qu'une réduction est possible. La règle A→ε fournit un seul
item A→.

Algorithme

1. Mettre chaque item de I dans fermeture (I).


2. Pour chaque item i de fermeture (I) de la forme A→α.Bβ
Pour chaque production B→µ (et pour chaque transition)
Rajouter l'item B→.µ dans la fermeture (I)
Fin Pour
Fin Pour
3. Recommencer 2 jusqu'à ce qu'on n'ajoute rien de nouveau.
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 34

6.1 Analyse LR (0)


6.1.2 Fermeture d'un ensemble d'items I
Exemple :
Soit la grammaire G=(A, N, S, R) avec A={+, x, (, )}, N={S, E, T}, R={S→ E$; E→E+T ; E→ T ; T→ x ; T→
(E)} et soit l'ensemble d'item I={E→ E+.T}
Fermeture (I)={E→E+.T ; T→ .x ; T→ .(E)}

6.1.3 Transition par X d'un ensemble d'items I

Δ(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

6.1 Analyse LR (0)


6.1.4 Collection des items d'une grammaire
Algorithme

0. Rajouter l'axiome S' avec la production S'→S$


1. Mettre dans l'ensemble d'items I0 la fermeture des ({S'→.S$}).
2. Mettre I0 dans collection.
3. Pour chaque I dans collection faire
Pour chaque X tel que Δ(I, X) non vide
Ajouter ce Δ(I, X) dans collection
Fin pour
Fin pour
4. Recommencer 3 jusqu'à ce qu'on n'ajoute rien de nouveau.
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 36

6.1 Analyse LR (0)


6.1.4 Collection des items d'une grammaire
Exemple :
1 2 3 4 5
Soit la grammaire G=(A, N, S, R) avec A={+, x, (, )}, N={S, E, T}, R={E'→ E$; E→E+T ; E→ T ; T→ x ; T→
(E)}.
I0=Fermeture (E'→.E$)={E'→.E$, E→.E+T ,E→. T, T→ .x ; T→ .(E)}
Collection={I0 }
Δ(I0, E) =fermeture(E→E.$, E→E.+T)={E→E.$, E→E.+T}=I1
Collection={I0 , I1}
Δ(I0, T) =fermeture(E→T.)={E→T.}=I2 (terminale pour la règle 3)
Collection={I0 , I1, I2}
Δ(I0, x) =fermeture(T→x.)={T→x.}=I3 (terminale pour la règle 4)
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 37

6.1 Analyse LR (0)


6.1.4 Collection des items d'une grammaire
Exemple :
Collection={I0 , I1, I2, I3}
Δ(I0, ( ) =fermeture(T→(.E))={T→(.E), E→.E+T ,E→ .T, T→ .x ; T→ .(E)}=I4
Collection={I0 , I1, I2, I3, I4}
Δ(I1, $) =fermeture(T→E$.)={T→E$.}=I5 (terminale pour la règle 1)
Collection={I0 , I1, I2, I3, I4, I5}
Δ(I1, +) =fermeture(E→E+.T)={E→E+.T , T→ .x ; T→ .(E)}=I6
Collection={I0 , I1, I2, I3, I4, I5, I6}
Δ(I4, E) =fermeture(T→(E.))={T→(E.), E→E.+T}=I7 (terminale pour la règle 3)
Collection={I0 , I1, I2, I3, I4, I5, I6, I7}
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 38

6.1 Analyse LR (0)


6.1.4 Collection des items d'une grammaire
Exemple :
Δ(I4, T) =fermeture(E→T.)={E→ T.}=I2
Δ(I4, x) =fermeture(T→x.)={T→x.}=I3
Δ(I4, ( ) =fermeture(T→(.E)=I4
Δ(I6, T) =fermeture(E→E+T.)={E→E+T.}=I8 (terminale pour la règle 2)
Collection={I0 , I1, I2, I3, I4, I5, I6, I7, I8}
Δ(I6, x) =fermeture(T→x.)={T→x.}=I3
Δ(I6, ( ) =I4
Δ(I7, ) ) =fermeture(T→(E).)={T→(E).}=I9 (terminale pour la règle 5)
Collection={I0 , I1, I2, I3, I4, I5, I6, I7, I8, , I9} ; Δ(I7, +) =I6
6. Analyse ascendante Techniques de compilation
Chapitre 3 : Analyse syntaxique 39

6.2 Construction de la table d'analyse LR(0)


Algorithme

1. Construire la collection des items {I0, I1, …, In}


2. L'état i est construit à partir de Ii
a) Pour chaque chaque Δ(Ii, a)=Ij, mettre décalage par j dans la case M(i, a)
b) Pour chaque Δ(Ii, A)=Ij, mettre aller à j dans la case M(i, A)
c) Pour chaque A→α (sauf A=S') contenu dans Ii, mettre réduction par numéro de la règle A→α dans la
case M(i, a) (quelque soit a terminal)
d) Si S'→S$ appartient à Ii, mettre accepter dans la case M(i,$)

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

6.2 Construction de la table d'analyse LR(0)


Exemple :
Pour l'exemple précédant on obtient la table d'analyse LR (0) suivante: (
(
Etat x + ( ) $ E T
0 T 2
T 4
0 D3 D4 1 2
1 D6 D5 E x x
E
2 R3 R3 R3 R3 R3
3 R4 R4 R4 R4 R4 1 3 ( 7
+
4 D3 D4 7 2 $ x )
5 Accepter +
6 D3 D4 8 5 6

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

6.3 Analyseur syntaxique LR(0)

On part de l'état 0 et on empile ou dépile les symboles ou les états successifs:


Exemple : L'analyse du mot m="x+(x)$" est donnée par :
Pile Entrée Action Pile Entrée Action
0 x+(x)$ Décalage 0|E|1|+|6|(|4|E )$ Aller à 7
0|x|3 +(x)$ Reduction T→ x 0|E|1|+|6|(|4|E|7 )$ Décalage
0|T +(x)$ Aller à 2
0|T|2 +(x)$ Reduction E→ T 0|E|1|+|6|(|4|E|7|)|9 $ Reduction T→(E)

0|E +(x)$ Aller à 1 0|E|1|+|6|T $ Aller à 8


0|E|1 +(x)$ Décalage 0|E|1|+|6|T|8 $ Reduction E→E+T
0|E|1|+|6 (x)$ Décalage 0|E $ Aller à 1
0|E|1|+|6|(|4 x)$ Décalage 0|E|1 $ Décalage
0|E|1|+|6|(|4|x|3 )$ Reduction T→x 0|E|1|$|5 $ Accepter
0|E|1|+|6|(|4|T )$ Aller à 2
0|E|1|+|6|(|4|T|2 )$ Réduction E→T
Merci de votre
attention

42

Vous aimerez peut-être aussi