analyse syntaxique diapos
TRANSCRIPT
-
7/28/2019 Analyse Syntaxique Diapos
1/27
11
Chapitre 02:
Analyse Syntaxique
-
7/28/2019 Analyse Syntaxique Diapos
2/27
22
Introduction
Tout langage de programmation possde des rgles indiquant la structure
syntaxique d'un programme bien form.Exemple
en Pascal, un programme bien form est compos de blocs, un bloc estform d'instructions, une instruction de ... .
La syntaxe d'un langage peut tre dcrite par une grammaire.
L'analyseur syntaxique reoit une suite d'units lexicales de la part del'analyseur lexical et doit vrifier que cette suite peut tre engendre par lagrammaire du langage: Est ce que mappartient au langage gnr parG?Le principe est d'essayer de construire un arbre de drivation.
-
7/28/2019 Analyse Syntaxique Diapos
3/27
33
Grammaires hors contexte
Une grammaire est un ensemble de rgles dcrivant comment former des phrases.Une grammaire est la donne de G=(VT,VN,S,P) o:
VTest un ensemble non vide de symboles terminaux (alphabet terminal) VNest un ensemble de symboles non-terminaux , avec VT VN Sest un symbole initial VN appel axiome Pest un ensemble de r gle de pr oductions
-
7/28/2019 Analyse Syntaxique Diapos
4/27
44
Arbre de drivationOn appelle ar br e de dr ivation (ou arbre syntaxique) tout arbre tel que La racine est l'axiome Les feuilles sont des units lexicales
Les nuds sont des symboles non-terminaux
Les fils d'un nud sont 0 n si et seulement si 0 n est uneproduction
Exemple Soit la grammaire ayant Spour axiome et pour rgles de production
Un arbre de drivation pour le mot accacbb est :
(drivations gauches)(drivations droites)
Ces deux suites diffrentes de drivations donnent le mme arbre de drivation.
-
7/28/2019 Analyse Syntaxique Diapos
5/27
55
Ambigut
Une grammaire est dite ambigu s'il existe un mot de L(G) ayant plusieurs arbressyntaxiques.
Exemple : Soit Gdonne par:
instr if (expr) instr else instr
inst if (expr) instr if (expr) instr
inst
expr
Solution propose
Stmt matched-stmt
| open-stmt
matched-stmt if expr then matched-stmtelse matched-stmt
| other
open-stmt if expr then stmt
| if expr then matched-stmtelse open-stmt
-
7/28/2019 Analyse Syntaxique Diapos
6/27
66
Mise en uvre d'un analyseur syntaxique
Il existe deux approches:
1. une mthode descendante: Analyseur LL(1)
2. une mthode ascendante: Analyseur LR(0), LR(1), SLR(1)
-
7/28/2019 Analyse Syntaxique Diapos
7/27
77
Rcursivit gauche
Une grammaire G est Rcursive Gauche (RG) sil existe une drivation de la forme :
A+
Aw, avec A N et w (N T)*Une rcursivit A Aw est dite immdiate
Elimination de la rcursivit gauche immdiate
Remplacer toute rgle de la forme AA| par les deux rgles :
AA'
A' A'| Elimination de la rcursivit gauche
Ordonner les non-terminaux A1,A2,AnPour i=1 n faire
pour j=1 i-1 faireremplacer chaque production de la forme A
i
Aj
o Aj
1
|| p parAj 1|| p
fin pourliminer les rcursivits gauche immdiates des productions Ai
fin pour
-
7/28/2019 Analyse Syntaxique Diapos
8/27
88
Rcursivit gaucheExemple
Soit la grammaire suivante:SAa|b
AAc|Sd|BA|c
BSSc|a
On ordonne S,A,B :SAa|b
i=1 pas de rcursivit immdiate dans SAa|bi=2 et j=1 on obtient : AAc|Aad|bd|BA|c
on limine la rcursivit immdiate :
AbdA'|BAA'|cA'
A' cA'|adA'|
i=3 et j=1 on obtient BAaSc|bSc|aet j=2 donne B bdA'aSc| BAA'aSc| cA'aSc|bSc|a
on limine la rcursivit immdiate:
B bdA'aScB' | cA'aScB' |bScB' |a B'
B' AA'aScB' |
On a obtenu:SAa|b
AbdA'|BAA'|cA'
A' cA'|adA'|
B bdA'aScB' |
cA'aScB'|bScB'|aB'
B' AA'aScB'|
-
7/28/2019 Analyse Syntaxique Diapos
9/27
99
Factorisation gaucheL'ide de base est que pour dvelopper un non-terminal A quand il n'est pas vident
de choisir l'alternative utiliser (c d quelle production prendre), on doit rcrireles productions de A de faon diffrer la dcision jusqu' ce que suffisamment detexte ait t lu pour faire le bon choix.
Solution:
Pour chaque non-terminal Atrouver le plus long prfixe commun deux de ses alternatives ou plus
Si , remplacerA1||n|1|..|p (o les i ne commencent pas par) par ledeux rgles:
AA'|1|..|pA'1||n
finpour
Recommencer jusqu' ne plus en trouver.
Exemple
-
7/28/2019 Analyse Syntaxique Diapos
10/27
1010
PremiersEnsemble de tous les terminaux qui peuvent commencer une chane (Vt U Vn)*,c--d tous les terminaux a telles qu'il existe une drivation *a .Algorithme de construction des ensembles PREMIER
Si Xest un non-terminal et X Y1,Y2Yn est une production (Yi(Vt U Vn) alors:
ajouter les lments de PREMIER(Y1) sauf dans PREMIER(X)
s'il existe j (j {2,,n}) tel que pour tout i=1,,j-1 on a PREMIER(Yi), alorsajouter les lments de PREMIER(Yj) sauf dans PREMIER(X)
si pour tout i=1,, n, PREMIER(Yi), alors ajouter dans PREMIER(X)
Si X est un non-terminal et X est une production, ajouter dans PREMIER(X)
Si X est un terminal, PREMIER(X)={X}
Recommencer jusqu' ce qu'on n'ajoute rien de nouveau dans les ensembles PREMIER.
Exemple
ETE PREMIER(E) = PREMIER(T)={(,nb}
E'+TE'| PREMIER(E') ={+,}
TFT PREMIER(T) = PREMIER(F) ={(,nb}
T'*FT'| PREMIER(T') ={*, }
F(E)|nb PREMIER(F) ={(,nb}
-
7/28/2019 Analyse Syntaxique Diapos
11/27
1111
Suivants
Ensemble de tous les symboles terminaux aqui peuvent apparatre immdiatement
droite de A dans une drivation : S*
AaAlgorithme de construction des ensembles SUIVANT :
Ajouter un marqueur de fin de chane ($) SUIVANT(S) ( Sest l'axiome)
S'il y a une production AB o Best un non-terminal, alors ajouter le contenu dePREMIER() SUIVANT(B), sauf
S'il y a une production A
B, alors ajouter SUIVANT(A) SUIVANT(B)S'il y a une production AB avec PREMIER() contient , alors ajouter
SUIVANT(A) SUIVANT(B).
Recommencer partir de l'tape 3 jusqu' ce qu'on n'ajoute rien dans les SUIVANT.
Exemple
ETE Suivant(E)={ $,)}E'+TE'| Suivant(E')={$,)}
TFT Suivant(T)={+,),$}
T'*FT'| Suivant(T')={ +,),$}
F(E)|nb Suivant(F)={ *,+,),$}
-
7/28/2019 Analyse Syntaxique Diapos
12/27
1212
Construction de la table d'analyse
Une table d'analyse est un tableau M deux dimensions qui indique pour chaque
symbole non-terminal A et chaque symbole terminal a(ou symbole $) la rgle deproduction appliquer.
Algorithme de construction
Pour chaque production faire1. pour tout PREMIER() (et a), rajouter la production A dans la case M[A,a]2. si PREMIER(), alors pour chaque SUIVANT(A) ajouterA dans M[A,b]
Chaque case M[A,a] vide est une erreur de syntaxe
Exemple
Pour l'exemple prcdent, on obtient la table
nb + * ( ) $
E ETE'
ETE'E ' E'+TE' E' E'
T TFT' TFT'T ' T' T'*FT' T' T'F Fnb F(E)
-
7/28/2019 Analyse Syntaxique Diapos
13/27
1313
Analyseur syntaxique descendantAlgorithme :
Donnes : mot m, table d'analyse Met un pointeurps sur la 1re lettre de mInitialisation de la pile S$
RpterSoit Xle symbole en sommet de pileSoit ala lettre pointe parpsSi Xest un non terminal alors
Si M[A,a]= XY1Yn alorsenleverXde la pile
mettre Ynpuis Yn-1puis ...puis Y1 dans la pilemettre en sortie la production XY1Yn
sinon ERREURSinon Si X=$ alors
Si a=$ alors ACCEPTERSinon ERREUR
SinonSi X=aalors
enleverXde la pileavancerps
Sinon ERREURJusqu' ERREUR ou ACCEPTER
-
7/28/2019 Analyse Syntaxique Diapos
14/27
-
7/28/2019 Analyse Syntaxique Diapos
15/27
1515
Analyse syntaxique ascendante
Construire un arbre de drivation du bas (les feuilles, ou les units lexicales) vers le
haut (la racine, ou l'axiome de dpart). Le modle gnral utilis est le modle pardcalagesrductions. C'est dire que
l'on ne s'autorise que deux oprations :
1. Dcalage (shift) : dcaler d'une lettre le pointeur sur le mot en entre.
2. Rduction (reduce) : Remplacer une chane par un non-terminal en utilisant une desrgles de production
-
7/28/2019 Analyse Syntaxique Diapos
16/27
1616
Analyseur ascendant
C'est une sorte d'automate, qu'on appelle automate pile. Cette table va nous dire ce
qu'il faut faire quand on lit une lettre a et qu'on est dans un tat i. Soit on dcale. Dans ce cas, on empile la lettre lue et on va dans un autre tatj. On
note a dj Soit on rduitpar la rgle de production numro p , c d qu'on remplace la chane en
sommet de pile par le non-terminal de la partie gauche de la rgle de production, eton va dans l'tatjqui dpend du non-terminal en question. On note a rp .
Soit on accepte le mot. Ce qui sera not ACC.
Soit c'est une erreur. c d Case vide.
-
7/28/2019 Analyse Syntaxique Diapos
17/27
1717
Construction de la table danalyse
Utilise aussi les ensembles SUIVANT et PREMIER, plus ce qu'on appelle des
fermetures de 0-items. Un 0-item (ou item) est une production de la grammaire avec un "." quelque part dans
la partie droite.
exemple :
E E . + T ou encore T F. ou encore F . ( E )
Fermeture d'un ensemble d'items I :
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 irajouter l'item B .i dans Fermeture (I)
3- Recommencer 2 jusqu' ce qu'on n'ajoute rien de nouveau
-
7/28/2019 Analyse Syntaxique Diapos
18/27
1818
Collection des items d'une grammaire
0- Rajouter l'axiome S'avec la production S'S$
1- Mettre dans l'item I0 la Fermeture de S'.S$})2- Mettre I0 dans Collection3 - Pour chaque Idans Collection faire
Pour chaque Xtel que (I, X)est non videajouter ce (I, X)dans Collection
Fin pour
4 - Recommencer 3 jusqu' ce qu'on n'ajoute rien de nouveau
-
7/28/2019 Analyse Syntaxique Diapos
19/27
1919
Collection des items (exemple)I0={S.E, E .E+T, E .T, T.T*F, T. F, F .nb, F .(E) }
(I0,E)= {SE., E E.+T}=I1
(I0,T)= {E T., TT.*F}=I2(I0,F)= {T F.}=I3(I0,()= {F(.E), E.E+T, E.T, T.T*F, T.F, F.nb, F.(E)}=I4(I0,nb)={ F nb.}=I5(I1,+)= {E E+.T, T.T*F, T. F, F .nb, F .(E) }=I6(I2,*)={ TT*.F, F .nb, F .(E)}=I7(I
4, E)= {F(E.), EE.+T}=I
8(I4, T)={ ET., TT.*F }=I2(I4, F)={ TF. }=I3(I4,nb)={ Fnb. }=I5(I4,()={ F(.E), E.E+T, E.T, T.T*F, T.F, F.nb, F.(E)}=I4(I6, T)= {E E+T., TT.*F }=I9(I6, F)={ TF. }=I3(I6, nb)={ Fnb. }=I5(I6, ()={ F(.E), E.E+T, E.T, T.T*F, T.F, F.nb, F.(E)}=I4(I7, F)={ TT*F.}=I10(I7, nb)={ Fnb. }=I5
(I7, ()={ F(.E), E.E+T, E.T, T.T*F, T.F, F.nb, F.(E)}=I4(I8, ))= {F(E).}=I11(I8, +)= {FE+.T, T.T*F, T. F, F .nb, F .(E) }=I6(I9,*)={ TT*.F, F .nb, F .(E)}=I7
-
7/28/2019 Analyse Syntaxique Diapos
20/27
2020
Construction de la table d'analyse SLR 1- Construire la collection d'items {I0, ... In}
2- l'tat i est construit partir de Ii :
a) pour chaque (Ii , a) = Ij : mettre dcalage parj 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. contenu dans I i :
pour chaque a de SUIVANT(A) fairemettre rduction par numro (de la rgle A) dans la case M[i,a]
-
7/28/2019 Analyse Syntaxique Diapos
21/27
2121
Construction de la table d'analyse SLRExemple:
PREMIE
R
SUIVANT
E nb ( $ + )
T nb ( $ + * )
F nb ( $ + * )
tat nb + * ( ) $ E T F
0 d5 d4 1 2 31 d6 ACC
2 r2 d7 r2 r23 r4 r4 r4 r44 d5 d4 8 2 35 r6 r6 r6 r66 d5 d4 9 37 d5 d4 108 d6 d119 r1 d7 r1 r110 r3 r3 r3 r3
11 r5 r5 r5 r5
-
7/28/2019 Analyse Syntaxique Diapos
22/27
2222
Analyseur syntaxique SLROn part dans l'tat 0, et on empile et dpile non seulement les symboles mais aussi les
tats successifs.
Exemple :
-
7/28/2019 Analyse Syntaxique Diapos
23/27
2323
Remarques Cette mthode permet d'analyser plus de grammaires que la mthode descendante
(car il y a plus de grammaires SLR que LL)
Dans cette mthode d'analyse, a n'a strictement aucune importance que la grammairesoit rcursive gauche, mme au contraire, on prfre.
Les grammaires ambigus provoquent des conflits
conflit dcalage/rduction : on ne peut pas dcider la lecture du terminal as'ilfaut rduire une production S ou dcaler le terminal
conflit rduction/rduction : on ne peut pas dcider la lecture du terminal as'ilfaut rduire une production S ou une production T
On doit alors rsoudre les conflits en donnant des priorits aux actions (dcaler ourduire) et aux productions.
-
7/28/2019 Analyse Syntaxique Diapos
24/27
2424
ExempleSoit la grammaire: E E+E|E*E|(E)|nb et
Soit analyser 3+4+5.
Lorsqu'on lit le 2me + on a le choix entre:
1. Rduire ce qu'on a dj lu parE E+E. Ce qui nous donnera finalement le calcul(3+4)+5
2. Dcaler ce +, ce qui nous donnera finalement le calcul 3+(4+5).
Ici c'est pareil. Mais bon, + est associatif gauche, donc on prfrera rduire. Soit
analyser 3+4*5. Lorsqu'on lit le * on a encore un choix shift/reduce. Si l'on rduit oncalcule (3+4)*5, si on dcale on calcule 3+(4*5) ! Il faut dcaler.
Soit analyser 3*4+5. On ne s'en fout pas non plus, il faut rduire !
il faut mettre quelque part dans l'analyseur le fait que * est prioritaire sur +.
-
7/28/2019 Analyse Syntaxique Diapos
25/27
2525
Erreurs syntaxiques Les erreurs syntaxiques rvles lorsque les units lexicales provenant de l'analyseur
lexical contredisent les rgles grammaticales.
La nature de l'erreur est trs difficile dduire. La plupart du temps, le gestionnaired'erreurs doit deviner ce que le programmeur avait en tte.
Il existe plusieurs stratgies de rcupration sur erreur : mode panique, au niveau dusyntagme, productions d'erreur, correction globale.
Une rcupration inadquate peut provoquer des erreurs qui n'ont pas t faites par le
programmeur mais sont la consquence du changement d'tat de l'analyseur lors de larcupration sur erreur.
-
7/28/2019 Analyse Syntaxique Diapos
26/27
2626
Erreurs syntaxiquesRcupration en mode panique
Quand il dcouvre une erreur, l'analyseur syntaxique limine les symboles d'entre lesuns aprs les autres jusqu' en rencontrer un qui appartienne un ensemble d'unitslexicales de synchronisation, par exemple les dlimiteurs (; , end ou }), dont le rledans un programme source est clair.
Bien que cette mthode saute en gnral une partie considrable du texte source sansen vrifier la validit, elle a l'avantage de la simplicit et ne peut pas entrer dans une
boucle infinie.Rcupration au niveau du syntagme
Quand une erreur est dcouverte, l'analyseur syntaxique peut effectuer des correctionslocales. Exp. remplacer une , par un ;, un wihle par un while, insrer un ; ou (
Le choix de la modification faire n'est pas vident en gnral.
L'inconvnient majeur de cette mthode est qu'il est impossible de grer les situationsdans lesquelles l'erreur relle s'est produite bien avant le point de dtection.
On implante cette rcupration sur erreur en remplissant les cases vides des tablesd'analyse par des pointeurs vers des routines d'erreur. Ces routines remplacent,insrentou supprimentdes symboles d'entre et mettent les messages appropris.
-
7/28/2019 Analyse Syntaxique Diapos
27/27
2727
Erreurs syntaxiques Productions d'erreur
Si l'on a une ide assez prcise des erreurs courantes qui peuvent tre rencontres, il
est possible d'augmenter la grammaire du langage avec des productions quiengendrent les constructions errones.Par exemple (pour un compilateur C) :
Iif E I (erreur : il manque les parenthses)Iif ( E )then I (erreur : il n'y a pas de then en C)
Correction globaleDans l'idal, il est souhaitable que le compilateur effectue aussi peu de changementsque possible. Il existe des algorithmes qui permettent de choisir une squenceminimale de changements correspondant globalement au cot de correction le plusfaible. Malheureusement, ces mthodes sont trop coteuses en temps et en espacepour tre implantes en pratique et ont donc uniquement un intrt thorique. Enoutre, le programme correct le plus proche n'est pas forcment celui que leprogrammeur avait en tte .