analyse syntaxique diapos

Upload: infcom

Post on 03-Apr-2018

232 views

Category:

Documents


0 download

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 .