Académique Documents
Professionnel Documents
Culture Documents
Compilation
2013 - 2014
M1 Informatique
Anne BERRY
Cours de Compilation
Anne BERRY
ENT : M 1_INFO_COMPIL
Bibliographie
1. Cours en ligne Keith Schwarz http://www.stanford.edu/class/cs143/
2. Des WATSON - High-Level Languages and Their Compilers - ISBN 0-201-18489-3
3. Daniel I.A. COHEN - Introduction to Computer Theory ISBN 0-471-54841-3
4. John HOPCROFT and Jeffrey ULLMAN - Introduction to Automata Theory, Languages
and Computation
5. Alfred AHO, Monica S. Lam, Ravi SETHI and Jeffrey ULLMAN - Compilers, Principles,
Techniques and Tools
6. Andrew W. APPEL - Modern compiler implementation in C
7. R. WILHELM and D. MAURER - Compiler Design
8. W. WAITE and G. GOOS - Compiler Construction
9. S. MUCHNICK - Advanced Compiler design Implementation
10. D. GRUNE, H. BAL, C. JACOBS et K. LANGENDOEN - Compilateurs
Plan du cours :
1 : Introduction: Qu'est-ce que la Compilation
2 : Quelques rappels de thorie des langages
3 : L'analyse lexicale
4 : L'analyse syntaxique
5 : Les fonctions FIRST et FOLLOW
6 : L'analyse descendante (langages LL)
7 : L'analyse ascendante (langages LR)
Tabledesmatires
1.Introduction........................................................................................................................................6
1.1.Dfinitiondelacompilation.......................................................................................................6
1.2.Quelquesproblmesposs........................................................................................................7
1.3.Unaperudesphasesdelacompilation...................................................................................9
2.Quelquesrappelsdethoriedeslangages
(voirAnnexe)......................................................................................................................................12
2.1.Feuilled'exercices1:rvisionsdethoriedeslangages..........................................................13
3.L'analyselexicale.............................................................................................................................15
4.L'analysesyntaxique........................................................................................................................16
5.LesfonctionsFIRSTetFOLLOW...................................................................................................18
5.1.Symbolesnullables...................................................................................................................18
5.2.DfinitiondeFIRST.................................................................................................................18
5.3.DfinitiondeFOLLOW...........................................................................................................19
5.4.CalculduFIRST......................................................................................................................19
5.5.CalculduFOLLOWdesnonterminaux..................................................................................21
6.L'analysedescendante(topdownparsing)......................................................................................23
6.1.LeslangagesLL.......................................................................................................................23
6.2.CaractrisationdesgrammairesLL(1)....................................................................................24
6.3.L'analyseurLL.........................................................................................................................24
6.4.Calculdelatabled'analyseLL................................................................................................27
6.5.Procdsdercritured'unegrammairenonLL(1)...............................................................28
6.5.1.Rcursivit........................................................................................................................28
UnegrammairealgbriqueGestditercursivegauche(leftrecursive)sietseulementsielle
contientunnonterminalAtelque...............................................................................................28
6.5.2.Factorisation.....................................................................................................................31
6.6.Feuilled'exercices2:leslangagesLL....................................................................................33
Procderl'analysedumot=4+5pourlesdeuxgrammaires........................................................33
7.L'analyseascendanteetleslangagesLR..........................................................................................34
7.1.Principedushiftreduceparsing...............................................................................................34
7.2.LesgrammairesLRetLALR...................................................................................................35
7.3.L'analyseurLR(1).....................................................................................................................36
7.4.LesgrammairesLALR.............................................................................................................39
7.5.Feuilled'exercices3:l'analyseurLALR..................................................................................40
7.6.Feuilled'exercices4:tudedesconflitsdanslestablesLALR(1).........................................41
8.ConstructiondestablesLALR(1)....................................................................................................45
8.1.Notationsetdfinitions............................................................................................................45
8.2.CalculdestablesLR(0)...........................................................................................................46
8.3.ConstructiondestablesLR(1).................................................................................................47
8.4.TablesLAR(1).........................................................................................................................49
8.5.Feuilled'exercices5:constructiondetablesLALR(1)..........................................................51
1. Introduction
''To all who know more than one language'' (Waite & Goos)
Remarque : la plupart des documents sont en anglais, ainsi que des termes techniques
utiliss.
1.1. Dfinitiondelacompilation
Un compilateur est un programme de traduction.
De faon gnrale :
- On part d'un code source
crit dans un 'langage de haut niveau' (langage de programmation, C, C++, Java, LISP...)
qui est facile manipuler pour un informaticien.
- Le compilateur traduit dans un langage cible (de type Assembleur), facile manipuler
pour l'ordinateur.
Ce langage cible est ensuite optimis.
Remarque : Il existe d'excellents compilateurs, mais il n'existe pas d'excellent traducteur
d'une langue naturelle une autre !
Buts de la compilation :
changer la forme tout en conservant la smantique.
Signaler les erreurs rencontres et aider l'informaticien les corriger.
La traduction s'effectue en plusieurs phases.
Chane de dveloppement d'un programme
Enonc d'un problme rsoudre
Analyse du problme (dcidabilit, classe de complexit)
Algorithme
Ecriture d'un code source
dbuggage
Compilation
Gnration du code cible
Optimisation
1.2. Quelques problmes poss
lechoixdulangage
portabilit
lisibilit
optimisation du code
Un mta-langage est un langage utilis pour dfinir un autre langage (par exemple des
rgles de grammaire).
Le langage peut servir se dcrire lui-mme.
"Un des buts de l'tude de la compilation pour un programmeur est de savoir choisir le bon
langage." (Watson)
La gestion des erreurs
Problmes d'IHM (Interface Homme/Machine) : clart des messages d'erreur, aide
efficace au dbuggage.
Quelles 'initiatives' peut-on laisser au compilateur ? (reparenthsage, retypage)
Quelles erreurs le compilateur peut-il 'ignorer' tout en continuant travailler?
(problmes de 'error recovery')
IHM (Interface Homme-Machine)
permissivit du langage
initiatives que peut prendre un compilateur
problmes de 'trade-off' (quilibre entre des compromis)
Exemple : Plus la compilation est rapide, moins l'optimisation du code est facile.
Problme de l'ambigut
Une phrase ambigu est une phrase laquelle on peut attribuer plusieurs sens.
Exemple :
2 + 3 * 4 s'interprte comme (2 + 3) * 4 ou 2 + (3 * 4)}
A quelle branche appartient la compilation ?
C'est une matire fondamentale pour l'informatique
Cela met en jeu :
-
la programmation
l'algorithmique
But de ce cours
Apprendre des outils qui permettent d'crire un compilateur (En TP : logiciels LEX
et YACC)
1.3. Unaperudesphasesdelacompilation
Code Source
analyse lexicale
analyse syntaxique
analyse smantique
Reprsentation abstraite
gnration de code intermdiaire
10
11
2. Quelquesrappelsdethoriedeslangages
(voirAnnexe)
12
2.1. Feuilled'exercices1:rvisionsdethoriedeslangages
Grammaires
1. Soit G la grammaire dfinie comme suit :
S bA | aB
A bAA | aS | a
B aBB | bS | b
Examiner si les mots suivants appartiennent L(G), et si oui, donner une drivation droite,
une drivation gauche, et l'arbre syntaxique correspondants :
1 = bbaaba 2 = babbab 3 = bbaaba
2. Montrer que la grammaire :
S aS | Sa |a
est ambigu et trouver une grammaire quivalente G' non-ambigu.
3. Soit G la grammaire sur {a,b} dfinie comme suit :
S SS | XaXaXa |
X bX |
Montrer que le mot = abbaba est dans L(G).
4. On considre la grammaire dfinie par :
S aB | bA
A a | aS | bAA
B b | bS | aBB
Examiner si les mots suivants appartiennent L(G), et si oui, donner une drivation droite,
une drivation gauche, et l'arbre syntaxique correspondant :
1 = aaabbabbba 2 = babbab
Existe-t-il une expression rgulire dcrivant le langage engendr par G ? Pourquoi ?
Si oui, donner cette expression rgulire.
5. Quel est le langage engendr par la grammaire :
S AA
A AAA
A bA | Ab | a
Dterminer si ce langage est rationnel et si oui, donner un automate d'tats finis, une
expression rgulire et une grammaire rgulire correspondants.
13
6. Amliorer la grammaire :
S aA | bB | cdD
A aB |
B aB | abB
D aD | bS |
Expressions rgulires
7. Montrer que les deux expressions rgulires r et s sont quivalentes :
r = (a+b)*a(a+b)*a(a+b)*
s = b*ab*a(a+b)*
8. Donner une grammaire engendrant le langage des mots sur {a,b}
comportant au moins une occurrence de 'a' et au moins une occurrence de 'b', ainsi
qu'une expression rgulire correspondante.
9. Trouver une grammaire G engendrant le langage dcrit par l'expression rgulire
r = ab*ab(a+b)*
10. Donner une expression rgulire dcrivant le mme langage que la grammaire :
S AaB
A bA |
B aB | bB |
Automates pile
11. Donner une grammaire et un automate pile pour le langage des mots 'bien
parenthss' sur {a,b}.
12. Donner une grammaire et un automate pile pour le langage des palindromes sur
{a,b}.
14
3. L'analyselexicale
L'analyse lexicale est un prtraitement trs important :
- segmentation des caractres du flot d'entre (sparation des 'mots' ou 'tokens' les uns
des autres)
- reprage et sparations des mots cls du langage
- dtection d'erreurs ( 'syntax error')
En TP, on utilisera l'outil 'LEX' (ou flex)
Transparents :
http://www.keithschwarz.com/cs143/WWW/sum2011/lectures/010_Lexical_Analysis.pdf
Keith Schwarz
15
4. L'analysesyntaxique
Le procd qui consiste trouver une drivation d'un mot d'un langage algbrique
s'appelle l'analyse syntaxique.
Il existe 2 grandes mthodes d'analyse :
La mthode ascendante (bottom-top)
La mthode descendante (top-to-bottom)
Mthode ascendante
Principe : On part d'un mot et on essaye de procder des remplacements successifs
qui permettent d'arriver l'axiome S.
Mthode descendante
Principe : On part de l'axiome S et on essaye de trouver une drivation qui aboutit .
Exemple 1 : Grammaire G1 :
S aA | b
A dA | e
Bf|g
mot analyser : = ade
Analyse descendante :
S (r1) aA (r3) ad A (r4) ade
Analyse ascendante :
ade (r4) adA (r3) aA (r1) S
Exemple 2 : Grammaire G2 :
S AB
A BA | a
Bb
mot : : bbab
Analyse descendante :
S (r1) AB (r2) BAB (r4) bAB (r2) bBAB (r4) bbAB (r3) bbaB (r4) bbab
Analyse ascendante :
bbab (r4) Bbab (r4) BBab (r3) BBAb (r2) BAb (r2) Ab (r4)AB (r1) S
16
17
5. LesfonctionsFIRSTetFOLLOW
Ces fonctions seront ncessaires pour construire les analyseurs tudis.
5.1. Symbolesnullables
Un symbole A N est nullable si A *
Calcul des symboles nullables
Initialisation : pour chaque -production A , A est nullable.
Rpter jusqu' obtention de stabilit :
Pour chaque rgle de production X Y1Y2 ... Yn,
(o chaque Yi est un caractre non-terminal diffrent)
si tous les Yi sont nullables, alors X est nullable.
5.2. DfinitiondeFIRST
Soit une chane de caractres ( NT).
FIRST() est l'ensemble de tous les terminaux qui peuvent commencer une chane
qui se drive de , avec en plus si est nullable :
FIRST()={x T | * x } { si est nullable}.
Exemple :
G3 :
E TE'
E' +TE' |
T FT'
T' *FT' |
F (E) | n
pour =TE' , '(' est dans FIRST ().
En effet : TE' (r2) T + TE' (r4) FT'+TE' (r7) (E)T'+TE'.
18
5.3. DfinitiondeFOLLOW
Soit A un symbole non-terminal.
FOLLOW(A) est l'ensemble de tous les terminaux qui peuvent apparatre
immdiatement droite de A dans une drivation S * A .
FOLLOW(A)={x T | S * A , avec x FIRST()}.
Remarque : le mot vide n'appartient jamais FOLLOW.
Exemple sur G3 :
')' est dans FOLLOW(E) :
en effet, E (r1) TE' (r4) FT'E' (r7) (E)T'E'.
On ajoutera un symbole de fin de mot, $ ; $ sera dans FOLLOW(S).
5.4. CalculduFIRST
On aura besoin de calculer FIRST() pour chaque qui est une partie droite d'une rgle
de production de la grammaire considre.
- Pour un caractre terminal x, FIRST(x)={x}.
- Pour les caractres non-terminaux X, on calcule FIRST(X).
- Pour partie droite d'une rgle on calcule FIRST().
Calcul de FIRST(X), pour tout X N
On va construire un graphe d'hritage (orient) dont les sommets sont les lments de N;
chaque sommet X aura une tiquette qui contiendra les lments de FIRST(X). Les arcs
permettront de faire hriter de symboles terminaux (mais pas de ).
Au dpart, le graphe n'a pas d'arc et les tiquettes sont toutes vides.
Pour chaque rgle de production de la forme X Y1Y2 ... Yn, (o chaque Yi est un
caractre diffrent de NT) :
Soit YK le premier Yi non nullable (si les Yi sont tous nullables, alors k=n)
Si YK est terminal, AJOUTER YK FIRST(X); AJOUTER les arcs ( Yi ,X) de i=1 k-1.
Sinon (YK est non-terminal), AJOUTER les arcs (Yi ,X) de i=1 k.
Faire hriter.
AJOUTER est dans FIRST de tous les non-terminaux nullables.
19
20
5.5. CalculduFOLLOWdesnonterminaux
De mme que pour FIRST, on construit un graphe d'hritage, dont les sommets sont les
lments de N; chaque sommet X aura une tiquette qui contiendra les lments de
FOLLOW(X).
Initialisation : mettre $ dans FOLLOW(S).
On va chercher 3 types de dcomposition des parties droites de rgles pour un symbole
non-terminal B de cette partie droite.
1. A B , ( (N T)*, , (N T)+, mais peut tre nullable) :
on met FIRST()- dans FOLLOW(B).
2. A B ou B avec nullable ( (N T)*, (N T)*) : ajouter l'arc (A,B) au
graphe d'hritage.
FIRST()
FOLLOW(B)
(avant)
FOLLOW(B)
(aprs)
E TE'
E'
{,+}
{+}
E' +TE'
E'
idem
idem
idem
T FT'
T'
{ ,*}
{*}
T' *FT'
T'
idem
idem
idem
F (E)
{)}
{$}
{$,)}
21
rgle
FIRST()
22
FOLLOW(B)
(avant)
FOLLOW(B)
(aprs)
2. rgles de type B
rgle
arc (A,B)
E TE'
E'
(E,E')
E' +TE'
E'
E'
rien
T FT'
T'
(T,T')
T' *FT'
T'
T'
rien
arc (A,B)
E TE'
E'
(E,T)
E' +TE'
E'
E'
(E',T)
T FT'
T'
(T,F)
T' *FT'
T'
T'
(T',F)
23
6. L'analysedescendante(topdownparsing)
6.1. LeslangagesLL
Rappels
Principe : on se donne une grammaire G et un mot , et on construit un arbre de
drivation en partant de l'axiome.
Exemples :
Grammaire G1 :
S aA | b
A dA | e
B f B| g
mot analyser : = ade
Analyse descendante :
S (r1) aA (r3) adA (r4) ade
Grammaire G2 :
S AB
A BA | a
Bb
mot : : bbab
Analyse descendante :
S (r1) AB (r2) BAB (r4) bAB (r2) bBAB (r4) bbAB (r3) bbaB (r4) bbab
On a construit une drivation gauche de , reprsentable par la suite de rgles
(r1,r2,r4,r2,r4,r3,r4), en utilisant un symbole de "look-ahead".
Cette technique est utilise pour des grammaires particulires, appeles LL(k) s'il y a k
symboles de "look-ahead" utiliser.
LL(k)="scanning the input from Left to right producing a Leftmost derivation, with k
symbols of look-ahead".
24
- Inconvnient : elle ne fonctionne sans conflits que sur une sous-classe des langages
algbriques dterministes.
- On dit qu'un langage L est LL(k) s'il existe une grammaire LL(k) qui engendre L.
- Un langage est LL(k) si il est LL(1).
- On parlera de la classe des langages LL.
Exemple de grammaire LL(1) : la grammaire G3 est une version LL de la grammaire
LALR(1) des expressions arithmtiques simples.
G3 :
E TE'
E' +TE' |
T FT'
T' *FT' |
F (E) | n
6.2. CaractrisationdesgrammairesLL(1)
Rappel : on dit qu'un symbole non-terminal A est nullable si A * , on dit qu'une chane
de caractres est nullable si * .
Pour dfinir une grammaire LL(1), on utilise les fonctions FIRST et FOLLOW, qui
permettront de choisir la rgle de grammaire appliquer.
Caractrisation
Une grammaire algbrique G est dite LL(1) si A N, associ aux rgles de production
A 1 | 2 | .... | n
on a, i,j , i j,
- FIRST(i) FIRST(j) =
- et, pour tout i nullable : FIRST(j) FOLLOW(A) =
Cette dfinition peut s'tendre aux grammaires LL(k).
FIRST et FOLLOW serviront construire la table d'analyse LL.
6.3. L'analyseurLL
On utilise encore une fois une table d'analyse, et la grammaire est LL(1) si et seulement si
la table est sans conflit. Une case vide correspond un 'reject'.
25
n (nombre) +
r1E TE'
E'
T
r3E'
r3E'
r6T'
r6 T'
r1E TE'
r2E'
+TE'
r4T FT'
T'
F
r4T FT'
r6T'
r5T'
*FT'
r8F n
r7F (E)
26
3e cas : X=Z0
- si p=$, ACCEPT.
- sinon, REJECT.
Exemple : on va analyser le mot = 2 + 3 * 4.
Pile
case
Z0,E
[E,n]
r1: E TE'
Z0, E', T
[T,n]
r4 : T FT'
[F,n]
r8 : F n
[T',+]
r6 : T'
Z0, E'
[E',+]
r2 : E' +TE'
Z0, E',T,+
Z0, E',T
[T,n]
r4 : T FT'
Z0, E',T',F
[F,n]
r8 : F n
Z0, E',T',n
Z0, E',T'
Z0, E',T',F,*
Z0, E',T',F
Z0, E',T',n
Z0, E',T'
[T',$]
r6 : T'
Z0, E'
[E',$]
r3 : E'
Z0
[Z0,$]
ACCEPT
n=2
+=+
n=3
[T',*]
dcalage
dcalage
dcalage
r5 : T' *FT'
*=*
[F,n]
dcalage
r8 : F n
n=4
dcalage
Suite de rgles : (r1, r4, r8, r6, r2, r4, r8, r5, r8, r6, r3).
Drivation gauche correspondante :
E (r1)TE' (r4) FT'E' (r8)nT'E' (r6) nE' (r2) n+TE' (r4) n+FT'E' (r8) n+nT'E'
(r5) n+n*FT'E'(r8) n+n*nT'E' (r6) n+n*nE' (r3) n+n*n
27
6.4. Calculdelatabled'analyseLL
On peut vrifier que G3 est bien une grammaire LL(1) :
Rgle de
production
factorise
FIRST(i)
FIRST(j)
j nullables
E TE'
rien
rien
E' +TE' |
FIRST(+TE')={+},
FIRST()={}
OK
T FT'
rien
rien
T' *FT' |
FIRST(*FT')={*},
FIRST()={}
OK
F (E) | n
FIRST((E))={(},
FIRST(n)={n}
OK
rien
28
si oui,
FOLLOW(A)FIRST
(j)
FOLLOW(E')= {$,) }
OK
FOLLOW(T')= {+,$,) }
OK
FOLLOW(E) = { $,)}
FOLLOW(E') = {$,) }
FOLLOW(T) = { +,$,)}
FOLLOW(T') = {+,$,) }
FOLLOW(F) = { +, *, $,)}
1 = TE' : FIRST(TE') = FIRST(T) = {(,n}.
2 = +TE' : FIRST(+TE') = {+}
3 = : FIRST() = {}
4 = FT' : FIRST(FT' ) = FIRST(F) = {(,n}.
5 = *FT' : FIRST(*FT' ) = {*}
6 = : FIRST() = {}
7 = (E) : FIRST((E))={(}
7 = n : FIRST(n)={n}
Rgle r1 : E TE' : FIRST(TE')={(,n} : on met r1 dans [E,(] et dans [E,n]
Rgle r2 : E' +TE' : FIRST(+TE')={+} : on met r2 dans [E',+]
Rgle r3 : E' : FIRST( )={ } ; est nullable ; FOLLOW(E')={$,) } ; on met r3 dans
[E',$] et dans E',)]
Rgle r4 : T FT' : FIRST(FT')={(,n} ; on met r4 dans [T,(] et dans [T,n].
Rgle r5 : T' *FT' ; FIRST(*FT') = {*} ; on met r6 dans [T'*].
Rgle r6 : T' : est nullable ; FOLLOW(T') = {+,$,) } ; on met r6 dans [T', +], [T',$ ]
et dans [T', )].
Rgle r7 : F (E) ; FIRST((E)) = {(} ; on met r7 dans [F,)].
Rgle r8 : F n ; FIRST(n)={n} ; on met r8 dans [F,n].
On retrouve la table utilise ci-dessus.
6.5. Procdsdercritured'unegrammairenonLL(1)
Rappel : on dit que l'on rcrit une grammaire G si on calcule une grammaire G'
quivalente G.
6.5.1. Rcursivit
Une grammaire algbrique G est dite rcursive gauche (left recursive) si et
29
Exemple :
G1 :
E E+T | T
T T*F | F
F (E) | n
G1 est rcursive gauche.
Proprit :
Une grammaire rcursive gauche n'est pas LL(1).
On peut parfois liminer la rcursivit en rcrivant la grammaire.
On distingue :
La rcursivit gauche immdiate
Il existe une rgle de type A A .
Elimination de la rcursivit gauche immdiate : pour chaque non-terminal A, on remplace
A A 1 | .... | A m | 1 |... | n
par :
A 1 A' | .... |n A'
A' 1 A' | .... | m A'|
On obtient une grammaire quivalente.
Exemple :
G1 :
E E+T | T
T T*F | F
F (E) | n
Traitement de
E E+T | T :
A A 1 | 1
30
on remplace par :
E TE'
E' +TE' | .
Traitement de
T T*F | F
on remplace par :
T FT'
T' *FT' |
On obtient la grammaire G3 :
E TE'
E' +TE' |
T FT'
T' *FT' |
F (E) | n
La rcursivit gauche non immdiate
Une grammaire est rcursive gauche (non immdiatement) si elle contient
un non-terminal A tel que
A + A , NT.
Exemple : G
S Aa | b
A Ac | Sd |
On a : S Aa Sda , donc G est rcursive gauche mais non immdiatement.
Elimination de la rcursivit gauche :
1. Attribuer un ordre arbitraire aux non-terminaux : (X1, X2, .....Xn)
2. Pour i=1 n faire
Pour j=1 i-1 faire
Remplacer chaque production de la forme Xi Xj , avec
Xj 1 | .... |r
par :
Xi 1 |.... | r
Eliminer les rcursivits gauches immdiates pour Xi.
31
6.5.2. Factorisation
Factorisation gauche
On dit qu'un grammaire algbrique G est non factorise gauche si elle contient un nonterminal A dont l'ensemble des parties droites de productions est de la forme
A 1 | 2....|1|....|p
Proprit : Une grammaire non factorise gauche n'est pas LL(1).
32
33
34
6.6. Feuilled'exercices2:leslangagesLL
1. Calculer la table d'analyse LL(1) pour :
S iBae
B TB |
T [eD] | di
D ed |
2. Calculer la table d'analyse LL(1) pour (aprs avoir factoris) :
S aB | bA
A a | aS | bAA
B b | bS | aBB
3. Considrons la grammaire G2 :
E E+E | E*E | (E) | n
1. Montrer que G2 est rcursive gauche et non factorise gauche.
2. Rcrire G2 en commenant par la factoriser, puis en traitant la rcursivit,
obtenant la grammaire G'2.
3. Rcrire G2 en commenant par traiter la rcursivit, puis en factorisant, obtenant
la grammaire G2.
4. Construire les deux tables d'analyse. G'2 et G2 sont-elles LL(1)?
Procder l'analyse du mot = 4+5 pour les deux grammaires.
35
7. L'analyseascendanteetleslangagesLR
7.1. Principedushiftreduceparsing
Principe : On se donne un mot , on le lit caractre par caractre et on tente de
reconstituer une drivation.
On va utiliser une pile qui va aider reprer des parties droites de rgles. On va donc
empiler jusqu' ce qu'on trouve une partie droite, puis on va dpiler cette partie droite
( l'envers) et rempiler la partie gauche sa place.
On utilise 2 oprations lmentaires :
- L'opration de dcalage (shift) qui consiste empiler le caractre courant, puis lire le
caractre suivant du mot analyser.
- L'opration de rduction (reduce), qui consiste remplacer la partie droite d'une rgle
par sa partie gauche (on dpile la partie droite de rgle correspondante et on rempile la
partie gauche).
Exemple : Grammaire G3 :
S aABe
A Abc | b
Bd
mot = abbcde
abbcde (shift a) abbcde (shift b) abbcde (red 3 : A b) aAbcde (shift b) aAbcde
(shift c) aAbcde(red 2 : A Abc) aAde (shift d) aAde
(red 4 : B d)aABe (shift e) aABe (red 1 : S aABe) S
On a construit la drivation droite :
S (r1)aABE (r4)aAde (r2) aAbcde (r3)abbcde
mot
abbcde$
abbcde$
abbcde$
abbcde$
driv. pile_avt
abbcde [
abbcde [a
abbcde [a,b
aAbcde [a,A
action
shift (a)
shift (b)
red 3 A b
shift (b)
pile aprs
[a
[a,b
[a,A
[a,A,b
36
7.2. LesgrammairesLRetLALR
Le shift-reduce parsing peut se faire sans conflit pour les grammaires LR(k).
LR(k)=Left-to-Right scan of the input producing a Rightmost derivation using k
symbols of look-ahead.
Dfinition :
On appelle grammaire LR(k), une grammaire algbrique G qui permet, en connaissant les
k caractres suivants du mot analyser, de dcider (de faon dterministe) quelle
opration appliquer pour arriver la drivation d'un mot de L(G).
Dfinition :
On appelle langage LR(k) un langage algbrique tel qu'il existe une grammaire LR(k)
qui l'engendre.
Thorme :
Tout langage LR(k) est aussi LR(1).
On appelle LR un langage qui est LR(1).
37
Thorme :
Un langage est LR si et seulement si il est algbrique et dterministe.
Pour dcider si un mot appartient au langage dfini par une grammaire LR, on utilise un
automate pile dterministe particulier (analyseur LR) prsent sous forme d'une table
d'analyse.
- Une table LR(k) est de dimension k+1.
- Dans la pratique, on n'utilise que les tables LR(1), qui sont des tables double entre.
La classe des langages LL est strictement incluse dans la classe des langages LR :
langages rationnels langages LL langages LR = langages algbriques dterministes
langages algbriques
7.3. L'analyseurLR(1)
On se donne :
- une table d'analyse
- une pile, qui contient une alternance d'tats numrots et de caractres de N T
- un mot analyser
- un pointeur p sur la lettre courante de
Initialisation :
On empile 0 et p pointe sur le premier caractre de .
Etape d'analyse :
On lit le haut de la pile (1 ou 2 caractres), et avec p, on en dduit une case de la table qui
va contenir des instructions.
1er cas :
Le symbole de haut de pile est un non-terminal F, on lit les 2 caractres de haut de pile
[i,F] qui donne un tat j, que l'on empile.
2e cas :
Le symbole de haut de pile est un tat i, on lit la case [i,p] de l'analyseur.
38
cas 2.1 : T[i,p]=rj (une rgle de la forme A ), on dpile jusqu' obtenir ( l'envers) tous
les caractres conscutifs de , puis on empile A.
cas 2.2 : T[i,p]=$sj$, on va effectuer un shift : on dcale p; on empile l'ancien p;
on empile l'tat j.
cas 2.3 : T[i,ps] est vide : REJECT : le mot n'appartient pas au langage.
cas 2.4 : T[i,ps] = ACCEPT, le mot est accept, et on obtient une drivation droite de ce
mot en reprenant ( l'inverse) la suite des rgles utilises.
Exemple : Grammaire G1 des expressions arithmtiques :
r1 : E E + T
r2 : E T
r3 : T T * F
r4 : T F
r5 : F (E)
r6 : F 0|1|2|3|4|5|6|7|8|9
ou :
r6 : F nb
Table d'analyse :
Etat
nb
s5
s4
s6
r2
s7
r2
r2
r4
r4
r4
r4
s4
r6
ACC
s5
r6
r6
s5
s4
s5
s4
r6
10
s6
s11
r1
s7
r1
r1
10
r3
r3
r3
r3
11
r5
r5
r5
r5
39
case
action
0,nb
s5
0,3,5
5,+
r6 : F nb
0,F
0,F
0,F,3
3,+
r4 : T F
0,T
O,T
0,T,2
2,+
r2 : E T
0,E
0,E
0,E,1
1,+
s6
0,E,1,+,6
6,nb
s5
0,E,1,+,6,4,5
5,*
r6 : F nb
0,E,1,+,6,F
6,F
0,E,1,+,6,F,3
3,*
r4 : T F
0,E,1,+,6,T
6,T
0,E,1,+,6,T,9
9,*
s7
0,E,1,+,6,T,9,*,7
7,nb
s5
0,E,1,+,6,T,9,*,7,2,5
5,$
r6 : F nb
0,E,1,+,6,T,9,*,7,F
7,F
10
0,E,1,+,6,T,9,*,7,F,10
10,$
r3 :T T * F
0,E,1,+,6,T
6,T
0,E,1,+,6,T,9
9,$
r1 : E E + T
0,E
0,E
0,E,1
1,$
ACCEPT
40
41
7.5. Feuilled'exercices3:l'analyseurLALR
Voici des grammaires avec pour chacune un mot analyser.
Vous trouverez les excutions YACC dans l'annexe 3.
Pour chaque grammaire, construire la table d'analyse. Pour chaque mot analyser,
signaler les ventuels conflits et la faon dont ils ont t rsolus, donner la suite de rgles
obtenue, ainsi que la drivation droite et l'arbre syntaxique correspondant.
1. Grammaire G1 des expressions arithmtiques : mot (2+3)
2. Grammaire rgulire engendrant le langage (aa + bb) + : mot bbaabb
3. Mots bien parenthss sur {a,b} : mot aababb
4. Langage 'EQUAL' (autant de 'a' que de 'b') : mot abba
5. Grammaire de anbn : mot aaabbb
6. Trailing Count : mot : abaaaa
7. Even-Even (un nombre pair de 'a' et un nombre pair de 'b') version rgulire : mot
abbabb
8. Even-Even (un nombre pair de 'a' et un nombre pair de 'b') version non rgulire : mot
abbabb
42
7.6. Feuilled'exercices4:tudedesconflitsdanslestablesLALR(1)
On va comparer deux grammaires des expression algbriques simples suivantes (n est un
nombre). La sortie YACC pour G2 est donne la fin.
G1 :
E E+T | T
T T*F | F
F (E) | n
G2 :
E E+E | E*E | (E) | n
Question 1
- Pour les mots 1= 1+2+3 et 2 = 4+5*6, donner tous les arbres syntaxiques possibles.
Que remarque-t-on?
- Pour chaque arbre syntaxique, donner la drivation droite ainsi que l'interprtation
correspondante. (Rappel : l'interprtation est le parenthsage de l'expression).
Question 2
Justifiez vos rponses aux questions suivantes :
- G1, G2 sont-elles ambigus ?
- G1 et G2 sont-elles quivalentes?
- G1 et G2 sont-elles LALR(1)? LR(1)?
- Quels sont les avantages et les inconvnients de G1 et de G2 ?
Question 3
Interprtations des formules incompltement parenthses :
Rappels :
associativit droite de + : 1+2+3 s'interprte comme (1+(2+3))
associativit gauche de + : 1+2+3 s'interprte comme ((1+2)+3)
prcdence de + sur * : 4+5*6 s'interprte comme ((4+5)*6)
prcdence de * sur + : 4+5*6 s'interprte comme (4+(5*6))
Quelle est la prcdence entre + et * dfinie par G1 ? G1 utilise-t-elle l'associativit
gauche ou droite? Comment pourrait-on modifier ces paramtres?
43
Question 4
On va maintenant tudier la prcdence et l'associativit pour G2.
En se servant de la question 1, donner la suite de rgles attendue dans une analyse
syntaxique du mot 1= 1+2+3 pour que + soit associative gauche, droite? Et de
mme, donner la suite de rgles attendue dans une analyse syntaxique du mot 2 =
4+5*6, pour que * ait prcdence sur +, ou que + ait prcdence sur *?
Question 5
Rsolutions de conflits dans G2
Comment doit-on rsoudre les conflits dans G2 (tats 9 et 10) pour que :
- * ait prcdence sur +
- + ait prcdence sur *
- + soit associatif gauche
- + soit associatif droite.
Dcrire les 8 cas rencontrs pour les 4 conflits dcalage/rduction , et expliquer quel
choix sur la prcdence ou l'associativit ils correspondent.
Question 6
Gestion des erreurs
Dans quelles cases vides de la table d'analyse de G2 pourrait-on mettre les messages
d'erreurs suivants :
- err 1 : 'oprande manquant'
- err 2 : 'parenthse ouvrante manquante'
- err 3 : 'oprateur manquant'
- err 4 : 'parenthse fermante manquante'
Expliquez pourquoi.
44
| E '*' E
| '(' E ')'
| 'n'
state 0
$accept : . E $end (0)
'(' shift 1
'n' shift 2
. error
E goto 3
state 1
E : '(' . E ')' (3)
'(' shift 1
'n' shift 2
. error
E goto 4
state 2
E : 'n' . (4)
. reduce 4
state 3
$accept : E . $end (0)
E : E . '+' E (1)
E : E . '*' E (2)
$end accept
45
'+' shift 5
'*' shift 6
. error
state 4
E : E . '+' E (1)
E : E . '*' E (2)
E : '(' E . ')' (3)
'+' shift 5
'*' shift 6
')' shift 7
. error
state 5
E : E '+' . E (1)
'(' shift 1
'n' shift 2
. error
E goto 8
state 6
E : E '*' . E (2)
'(' shift 1
'n' shift 2
. error
E goto 9
state 7
E : '(' E ')' . (3)
. reduce 3
46
'+' shift 5
'*' shift 6
$end reduce 1
')' reduce 1
'+' shift 5
'*' shift 6
$end reduce 2
')' reduce 2
7 terminals, 2 nonterminals
5 grammar rules, 10 states
47
8. ConstructiondestablesLALR(1)
8.1. Notationsetdfinitions
Dans toute la suite, on considrera une grammaire G=(N,T,P,S).
Une rgle de P sera dsigne par :
A
ou bien par :
A X1X2...Xn , o chaque Xi est un caractre de NT .
Items
Etant donne un rgle A X1X2...Xn , un item est cette rgle avec un point insr dans la
partie droite. Par exemple, A X1 X2...Xn est un item.
Ce point peut aussi tre positionn au dbut ou la fin de la chane.
A X1X2...Xn et A X1X2...Xn sont des items.
Le point symbolise la pile : ce qui est gauche du point est empil.
Le but est d'empiler une partie droite de rgle, pour pouvoir procder une rduction.
Grammaire augmente
On ajoute une rgle fictive S' S G.
On va construire un automate (un graphe de transitions) dont les sommets sont des tats
et o les arcs d'un sommet vers un autre sont tiquets par des transitions.
Les tats contiennent des items.
Principe gnral :
On ferme I0.
On ferme chaque nouvel tat et on dfinit les transitions dont il est l'origine.
et ainsi de suite...
48
8.2. Casparticulier:lestablesLR(0)
Etat initial : I0= S' S
Procd de fermeture d'un tat
Pour chaque rgle de type A X1 X2...Xi Xi+1 ...Xn
(le point n'est pas la fin) telle que Xi+1 est dans N,
pour chaque rgle de type Xi+1 , on ajoute l'item Xi+1 .
On recommence sur les nouveaux items jusqu stabilit.
Transition de l'tat Ii l'tat Ij
Principe : on cre un nouvel item en dcalant le point d'un cran vers la droite.
Par exemple, A X1 X2...Xn devient A X1 X2. X3..Xn
La transition associe est tiquete par X2
Exemple (extrait du cours de Keith Schwarz) :
G:
E' E
E T
E E+T
T int
T (E)
49
Sur l'exemple :
+
I0
s3
I1
s5
I2
r1
I3
I4
s4
ACCEPT
r1
r1
s3
r3
int
r3
r1
r1
s4
r3
r3
50
r3
I5
s3
s4
I6
s5
s7
I7
r4
r4
r4
r4
r4
I8
r2
r2
r2
r2
r2
8.3. ConstructiondestablesLR(1)
On va insrer un caractre de 'look-ahead' pour passer la classe LR(1).
Pour cela, on va ajouter chaque item une liste de terminaux qui indiqueront quelles sont
les transitions autorises lors d'une opration de rduction (reduce).
Notation : A X1 X2...Xi Xi+1 ...Xn , [a1, a2, ....]
X1 X2...Xi Xi+1 ...Xn s'appelle le coeur de l'item ; on appellera [a1, a2, ....] le look-ahead de
l'item.
Abus de langage : on dira que A X1 X2...Xi Xi+1 ...Xn , ai est un item.
Etat initial : I0= S' S , [$]
Procd de fermeture d'un tat
Pour chaque item de type A B , a (avec B dans N)
pour chaque rgle de type B ,
pour chaque terminal b dans FIRST (a) ,
on ajoute l'item B , b
51
Calcul de la table LR(1) : Comme pour les tables LR(0) sauf que
Sur l'exemple :
52
53
On va fusionner les tats qui ont le mme cur, et on fera l'union des look-aheads
correspondants.
Cette fusion peut engendrer des conflits supplmentaires de type reduce/reduce.
54
55
56
'a' shift 1
'b' shift 2
$end reduce 6
S goto 9
state 7
S : 'b' B . (2)
. reduce 2
state 8
A : 'a' S . (3)
. reduce 3
state 9
B : 'b' S . (5)
. reduce 5
4 terminals, 4 nonterminals
7 grammar rules, 10 states
57
58
59
state 7
S : 'b' S 'b' . (2)
. reduce 2
State 1 contains 1 shift/reduce conflict.
State 2 contains 1 shift/reduce conflict.
4 terminals, 2 nonterminals
4 grammar rules, 8 states
60
61