Вы находитесь на странице: 1из 27

Chapitre 02: Analyse Syntaxique

1 1

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 est form 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 de l'analyseur lexical et doit vrifier que cette suite peut tre engendre par la grammaire du langage: Est ce que m appartient au langage gnr par G? Le principe est d'essayer de construire un arbre de drivation.

2 2

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:

VT est un ensemble non vide de symboles ter minaux (alphabet terminal) VN est un ensemble de symboles non-ter minaux, avec VT VN S est un symbole initial VN appel axiome P est un ensemble de r gle de pr oductions

3 3

Arbre de drivation
On 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 une production Exemple Soit la grammaire ayant S pour 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.
4 4

Ambigut

Une grammaire est dite ambigu s'il existe un mot de L(G) ayant plusieurs arbres syntaxiques. Exemple : Soit G donne par: instr if (expr) instr else instr inst if (expr) instr if (expr) instr inst Solution propose expr Stmt matched-stmt | open-stmt matched-stmt if expr then matched-stmt else matched-stmt | other open-stmt if expr then stmt | if expr then matched-stmt else open-stmt

5 5

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)

6 6

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,An Pour i=1 n faire pour j=1 i-1 faire remplacer chaque production de la forme AiAj o Aj 1|| p par Aj 1|| p fin pour liminer les rcursivits gauche immdiates des productions Ai fin pour

7 7

Rcursivit gauche
Exemple
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|b i=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|a et 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'|

8 8

Factorisation gauche
L'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 rcrire les productions de A de faon diffrer la dcision jusqu' ce que suffisamment de texte ait t lu pour faire le bon choix. Solution: Pour chaque non-terminal A trouver le plus long prfixe commun deux de ses alternatives ou plus Si , remplacer A1||n|1|..|p (o les i ne commencent pas par) par le deux rgles: AA'|1|..|p A'1||n finpour Recommencer jusqu' ne plus en trouver. Exemple

9 9

Premiers
Ensemble 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 X est 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), alors ajouter 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}

10 10

Suivants
Ensemble de tous les symboles terminaux a qui peuvent apparatre immdiatement droite de A dans une drivation : S*Aa Algorithme de construction des ensembles SUIVANT : Ajouter un marqueur de fin de chane ($) SUIVANT(S) ( S est l'axiome) S'il y a une production AB o B est un non-terminal, alors ajouter le contenu de PREMIER() SUIVANT(B), sauf S'il y a une production AB, 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)={ *,+,),$}
11 11

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 de production appliquer. Algorithme de construction Pour chaque production faire 1. pour tout PREMIER() (et a), rajouter la production A dans la case M[A,a] 2. si PREMIER(), alors pour chaque SUIVANT(A) ajouter A dans M[A,b] Chaque case M[A,a] vide est une erreur de syntaxe Exemple Pour l'exemple prcdent, on obtient la table
E E' T T' F
nb ETE' TFT' Fnb + E'+TE' T' T'*FT' * ( ETE' TFT' F(E) ) E' T' $ E' T'

12 12

Analyseur syntaxique descendant


Algorithme :

Donnes : mot m, table d'analyse M et un pointeur ps sur la 1re lettre de m Initialisation de la pile S$ Rpter Soit X le symbole en sommet de pile Soit a la lettre pointe par ps Si X est un non terminal alors Si M[A,a]= XY1Yn alors enlever X de la pile mettre Yn puis Yn-1 puis ...puis Y1 dans la pile mettre en sortie la production XY1Yn sinon ERREUR Sinon Si X=$ alors Si a=$ alors ACCEPTER Sinon ERREUR Sinon Si X=a alors enlever X de la pile avancer ps Sinon ERREUR Jusqu' ERREUR ou ACCEPTER
13 13

Analyse syntaxique descendante


Exemple1 soit le mot m=3+4*5
PILE $E $ E'T $ E'T'F $ E'T'3 $ E'T' $ E' $ E'T+ $ E'T $ E'T'F $ E'T'4 $ E'T' $ E'T'F* $ E'T'F $ E'T'5 $ E'T' $ E' $ Entre 3+4*5$ 3+4*5$ 3+4*5$ 3+4*5$ +4*5$ +4*5$ +4*5$ 4*5$ 4*5$ 4*5$ *5$ *5$ 5$ 5$ $ $ $ Sortie ETE' TFT' Fnb T' E'+TE' TFT' Fnb T'*FT' Fnb T' E' analyse syntaxique russie Figure 5.1: Arbre syntaxique pour 3+4*5

14 14

Analyse syntaxique ascendante


1. 2.

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 par dcalagesrductions. C'est dire que l'on ne s'autorise que deux oprations : Dcalage (shift) : dcaler d'une lettre le pointeur sur le mot en entre. Rduction (reduce) : Remplacer une chane par un non-terminal en utilisant une des rgles de production

15 15

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 tat j. On note a dj Soit on rduit par 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, et on va dans l'tat j qui 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.

16 16

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 i rajouter l'item B .i dans Fermeture (I) 3- Recommencer 2 jusqu' ce qu'on n'ajoute rien de nouveau

17 17

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 Collection 3 - Pour chaque I dans Collection faire Pour chaque X tel que (I, X) est non vide ajouter ce (I, X) dans Collection Fin pour 4 - Recommencer 3 jusqu' ce qu'on n'ajoute rien de nouveau

18 18

Collection des items (exemple)


I0={S.E, E .E+T, E .T, T.T*F, T. F, F .nb, F .(E) } (I0,E)= {S E., 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 (I4, E)= {F(E.), EE.+T}=I8 (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, ()={ F(.E), E.E+T, E.T, T.T*F, T.F, F.nb, F.(E)}=I4 (I7, nb)={ Fnb. }=I5 (I , ))= {F(E).}=I
8 11

(I8, +)= {FE+.T, T.T*F, T. F, F .nb, F .(E) }=I6 (I9,*)={ TT*.F, F .nb, F .(E)}=I7
19 19

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 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. contenu dans I i : pour chaque a de SUIVANT(A) faire mettre rduction par numro (de la rgle A) dans la case M[i,a]

20 20

Construction de la table d'analyse SLR


Exemple:
PREMIE R nb ( nb ( nb ( SUIVANT $+ ) $+*) $+* ) E T F

tat 0 1 2 3 4 5 6 7 8 9 10 11

nb d5

+ d6 r2 r4

( d4

$ ACC r2 r4

E 1

T 2

F 3

d7 r4 d4 r6 d4 d4

r2 r4 r6

d5 r6 d5 d5 d6 r1 r3 r5 d7 r3 r5

8 r6

2 9

3 3 10

d11 r1 r3 r5

r1 r3 r5

21 21

Analyseur syntaxique SLR


On part dans l'tat 0, et on empile et dpile non seulement les symboles mais aussi les tats successifs. Exemple :

22 22

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 grammaire soit 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 a s'il faut rduire une production S ou dcaler le terminal conflit rduction/rduction : on ne peut pas dcider la lecture du terminal a s'il faut rduire une production S ou une production T On doit alors rsoudre les conflits en donnant des priorits aux actions (dcaler ou rduire) et aux productions.

23 23

Exemple
Soit 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 par E 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 on calcule (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 +.

24 24

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 gestionnaire d'erreurs doit deviner ce que le programmeur avait en tte. Il existe plusieurs stratgies de rcupration sur erreur : mode panique, au niveau du syntagme, 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 la rcupration sur erreur.

25 25

Erreurs syntaxiques
Rcupration en mode panique
Quand il dcouvre une erreur, l'analyseur syntaxique limine les symboles d'entre les uns aprs les autres jusqu' en rencontrer un qui appartienne un ensemble d'units lexicales de synchronisation, par exemple les dlimiteurs (; , end ou }), dont le rle dans un programme source est clair. Bien que cette mthode saute en gnral une partie considrable du texte source sans en 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 corrections locales. 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 situations dans 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 tables d'analyse par des pointeurs vers des routines d'erreur. Ces routines remplacent, insrent ou suppriment des symboles d'entre et mettent les messages appropris.
26 26

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 qui engendrent les constructions errones. Par exemple (pour un compilateur C) : I if E I (erreur : il manque les parenthses) I if ( E ) then I (erreur : il n'y a pas de then en C) Correction globale Dans l'idal, il est souhaitable que le compilateur effectue aussi peu de changements que possible. Il existe des algorithmes qui permettent de choisir une squence minimale de changements correspondant globalement au cot de correction le plus faible. Malheureusement, ces mthodes sont trop coteuses en temps et en espace pour tre implantes en pratique et ont donc uniquement un intrt thorique. En outre, le programme correct le plus proche n'est pas forcment celui que le programmeur avait en tte .

27 27

Вам также может понравиться