La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Analyse syntaxique Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)

Présentations similaires


Présentation au sujet: "Analyse syntaxique Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)"— Transcription de la présentation:

1 Analyse syntaxique Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)

2 Analyse syntaxique Grammaires contexte-libre et Automates à pile(PDA) Analyse descendante récursive Propriétés LL(1) Traitement des erreurs

3 Grammaires à contexte libre Problème Les grammaires régulières ne traitent pas la récursion centrale E = x | "(" E ")". On utilise alors les grammaires à contexte libre Définition Une grammaire est dite à contexte libre (CFG) si toutes ses productions ont la forme: A =. A est un NTS, séquence non vide de TS et NTS En EBNF le coté droit peut aussi contenir les meta-symboles |, (), [] and {} Exemple Expr = Term { ( "+" | "-" ) Term }. Term = Factor { ( "*" | "/" ) Factor }. Factor = id | "(" Expr ")". Récursion centrale indirecte Les grammaires à contexte libre peuvent être reconnues par les automates à pile (PDA)

4 Automates à pile :Push-Down Automaton(PDA) Caractéristiques Permet les transitions avec des symboles terminaux et des symboles non terminaux Utilise une pile pour sauvegarder les états visités Exemple E = x | "(" E ")". x E reconnu revenir 1 arc continuer à partir de là avec E E/1 ( E ) E/3 E stop État lecture État réduire E/1 ( E ) E/3 Appel récursif de lautomate E x E/1 ( E ) x...

5 Automates à pile (suite) x E/1 ( E ) E/3 E stop E/1 ( E ) E/3 x... Peut être simplifié comme suit x E/1 ( E ) E/3 E stop x ( Utilise une pile pour trouver le chemin de retour des états visités

6 Comment fonctionne un PDA? x E/1 ( E ) E/3 E stop x ( Les états visités sont rangés dans une pile 0.( ( x ) ) 0 2.( x ) ) x ) ) ) ) E ) ) ) ) ) 0 2.E ) ) E Exemple: ((x)) PileReste à analyser (x E/1 12 ( 3 E ) E/3 4 ) 4 3 E stop E

7 Grammaires régulières et Grammaires à contexte libre Grammaires régulièresGrammaires à contexte libre Utilisées pourLexiqueSyntaxe Reconnues parDFA (sans pile)PDA (avec pile) DFA (état) Entrée DFA (état) Entrée pile Productions A = a | b C. A =.

8 Analyse syntaxique Grammaires contexte-libre et Automates à pile(PDA Analyse descendante récursive Propriétés LL(1) Traitement des erreurs

9 Analyse descendante récursive Technique danalyse Top-down (de haut en bas) Larbre syntaxique est construit du symbole initial(axiome) vers la phrase (top-down) Exemple grammaireEntrée A = a A c | b b.a b b c ab b b b Aa c c A Symbole de départ Entrée abbc A ? Quelle est Lalternative qui convient? abb Aa c c A ? La bonne alternative est sélectionnée utilisant... Lunité lexicale courante de lentrée Les premiers symboles terminaux des alternatives dune production

10 Variables statiques de lanalyseur syntaxique Unité lexicale courante static int la;// code de lunité lexicale courante A tout moment lanalyseur connaît la prochaine unité lexicale Il utilise deux variables pour les unités lexicales (pour la phase sémantique) static Token token;// unité déjà reconnue static Token laToken;// unité courante non encore reconnue Ces variables sont mises à jour dans la méthode Scan() static void Scan () { token = laToken; laToken = Scanner.Next(); la = laToken.kind; } Entrée Déjà reconnues Scan() est appelée au début de lanalyse. La première unité est dans la identassignidentplusident tokenlaToken la

11 Comment analyser les symboles terminaux? Modèle Symbole à analyser: a Action de lanalyseur: Check(a); On a besoin des méthodes suivantes static void Check (int expected) { if (la == expected) Scan(); // recognized => read ahead else Error( ); } public static void Error (string msg) { Console.WriteLine("– line {0}, col {1}: {2}", laToken.line, laToken.col, msg); throw new Exception("Panic Mode"); } Les noms des symboles terminaux sont déclarés comme des constantes dans la classe Token public const intNONE = 0, IDENT = 1, NUMBER = 2,..., PLUS = 4, MINUS = 5,... ; public static string[] names = {"?", "identifier", "number",..., "+", "-",...}; Ordonné par code Token.names[expected] + " expected" Dans la class Token:

12 Comment analyser les symboles non terminaux? Modèle Symbole à analyser : A Action de lanalyseur : A(); // Appel à la méthode danalyse de A Chaque symbole non terminal est reconnu par une méthode avec le même nom private static void A() {... parsing actions for the right-hand side of A... } Initialisation de lanalyseur public static void Parse () { Scan();// initialise token, laToken et la Program();// appelle la méthode danalyse de laxiome Check(Token.EOF);// à la fin, lentrée doit être vide }

13 Comment analyser les séquences? Modèle production: A = a B c. Méthode de lanalyseur: static void A () { // la contains a terminal start symbol of A Check(a); B(); Check(c); // la contains a follower of A } b b c b c c c Simulation A = a B c. B = b b. static void A () { Check(a); B(); Check(c); } static void B() { Check(b); } a b b c Entrée restante

14 Comment analyser les alternatives Modèle | |,, sont des expressions EBNF Action de lanalyseur if (la in First( )) {... parse... } else if (la in First( )) {... parse... } else Error("..."); // find a meaninful error message Exemple A = a B | B b. B = c | d. First(aB) = {a} First(Bb) = First(B) = {c, d} static void A () { if (la == a) { Check(a); B(); } else if (la == c || la == d) { B(); Check(b); } else Error ("invalid start of A"); } static void B () { if (la == c) Check(c); else if (la == d) Check(d); else Error ("invalid start of B"); } exemples:analyser a d et c b analyser b b

15 Comment analyser les Options EBNF Modèle [ ] est une expression EBNF Action de lanalyseur if (la in First( )) {... parse... } // no error branch! Exemple A = [ a b ] c. static void A () { if (la == a) { Check(a); Check(b); } Check(c); } Exemple:analyser a b c analyser c

16 Comment analyser les itérations EBNF Modèle { } est une expression EBNF Action de lanalyseur while (la in First( )) {... parse... } Exemple A = a { B } b. B = c | d. static void A () { Check(a); while (la == c || la == d) B(); Check(b); } Exemple:analyser a c d c b analyser a b static void A () { Check(a); while (la != b && la != Token.EOF) B(); check(b); } Ou bien... Sans EOF: danger dune boucle infinie, si b nexiste pas dans lentrée

17 Cas des ensembles First grands Si lensemble First a plus de 4 : utiliser la classe BitArray Exemple:First(A) = {a, b, c, d, e} First(B) = {f, g, h, i, j} Les ensembles First sont initialisés au début du programme using System.Collections; static BitArray firstA = new BitArray(Token.names.Length); firstA[a] = true; firstA[b] = true; firstA[c] = true; firstA[d] = true; firstA[e] = true; static BitArray firstB = new BitArray(Token.names.Length); firstB[f] = true; firstB[g] = true; firstB[h] = true; firstB[i] = true; firstB[j] = true; Exemple static void C () { if (firstA[la]) A(); else if (firstB[la]) B(); else Error("invalid C"); } C = A | B.

18 Cas des ensembles First grands Si lensemble a moins de 4 éléments: utiliser des vérifications explicites (plus rapide) Exemple : First(A) = {a, b, c} if (la == a || la == b || la == c)... Si lensemble est un intervalle: utiliser un test dintervalle if (a <= la && la <= c)... Les codes des unités lexicales sont souvent choisis de telle sorte quils forment des intervalles Exemple First(A) = {a,c,d} First(B) = {a,d} First(C) = {b,e} const int a = 0, d = 1, c = 2, b = 3, e = 4, First(A) First(B) First(C)

19 Optimisations Éviter les multiples vérifications A = a | b. static void A () { if (la == a) Scan(); // no Check(a); else if (la == b) Scan(); else Error("invalid A"); } A = { a | B d }. B = b | c. static void A () { while (la == a || la == b || la == c) { if (la == a) Scan(); else { // no check any more B(); Check(d); } // no error case } Schéma plus efficace pour analyser les alternatives dans une itération static void A () { for (;;) { if (la == a) Scan(); else if (la == b || la == c) { B(); Check(d); } else break; } A = { a | B d }.

20 Optimisations Modèle dune itération fréquente { separator } ident { "," ident } Exemple for (;;) {... parse... if (la == separator) Scan(); else break; } for (;;) { Check(ident); if (la == Token.COMMA) Scan(); else break; } Exemple dentrée: a, b, c :

21 Déterminer correctement les ensembles First Grammaire A=B a. B={ b } c |[ d ] |e. Méthodes danalyse static void A () { B(); Check(a); } static void B () { if (la == b || la == c) { while (la == b) Scan(); Check(c); } else if (la == d || la == a) { if (la == d) Scan(); } else if (la == e) { Scan(); } else Error("invalid B"); } b et c d et a (!) e First C=D e |f. D={ d }. d et e (D est annulable!) f static void C () { if (la == d || la == e) { D(); Check(e); } else if (la == f) { Scan(); } else Error("invalid C"); } static void D () { while (la == d) Scan(); }

22 Descente récursive et arbre syntaxique Larbre syntaxique est construit implicitement Représente les méthodes actives à un moment donné Représente les productions utilisées Exemple A = a B c. B = d e. call A() static void A () { Check(a); B(); Check(c); } aBc A A en exécution reconnaît a call B() static void B () { Check(d); Check(e); } aBc A de A en exécution B en exécution reconnaît d et e Retour de B() aBc A A en exécution " pile"

23 Analyse syntaxique Grammaires contexte-libre et Automates à pile(PDA Analyse descendante récursive Propriétés LL(1) Traitement des erreurs

24 Propriétés LL(1) Pré condition pour lanalyse descendante récursive LL(1)...peut être analysé de gauche ( Left) à droite avec des dérivations canoniques gauche (Left) ( le NTS le plus à gauche est dérivé en premier ) et utilise une seule unité lexicale (1) de lentrée Définition 1.Une grammaire est LL(1) si toutes ses productions sont LL(1). 2.Une production A est LL(1) si pour toutes ses alternatives 1 | 2 |... | n la condition suivante est vérifiée: First( i ) Intersection First( j ) = {} ( pour tout i et j) [ Au plus un k peut être vide. Et dans ce cas First( i ) Intersection Follow( ) = {} ( pour tout i #k)] En dautres termes Les symboles terminaux de début de toutes les alternatives dune production doivent être disjoints deux à deux. Lanalyseur doit être capable de choisir lune des alternatives par la consultation de la lunité lexicale courante.

25 Comment éliminer les conflits LL(1) ? Factorisation IfStatement="if" "(" Expr ")" Statement |"if" "(" Expr ")" Statement "else" Statement. Extraire la séquence commune de début IfStatement="if" "(" Expr ")" Statement ( | "else" Statement ).... Ou en EBNF IfStatement="if" "(" Expr ")" Statement [ "else" Statement ]. Quelquefois les non terminaux doivent être remplacés avant factorisation Statement=Designator "=" Expr ";" |ident "(" [ ActualParameters ] ")" ";". Designator=ident { "." ident }. Remplacer Designator dans Statement Statement=ident { "." ident } "=" Expr ";" |ident "(" [ ActualParameters ] ")" ";". ensuite factoriser Statement=ident({ "." ident } "=" Expr ";" |"(" [ ActualParameters ] ")" ";" ).

26 Comment éliminer la Récursion gauche La récursion à gauche est toujours un conflit LL(1) IdentList = ident | IdentList "," ident. Par exemple génère les phrases suivantes ident ident "," ident ident "," ident "," ident... Peut toujours être remplacée par une itération IdentList = ident { "," ident }.

27 Conflits LL(1) cachés Les itérations et les options EBNF sont des alternatives cachées A = [ ]. First( ) Inter Follow(A) doit être {} A = { }. First( ) Inter Follow(A) doit être {} A = |. First( ) Inter Follow(A) doit être {} A = [ ]. Idem A = |. et sont des expressions EBNF A = [ ]. First( ) Inter First( ) doit être {} A = { }. First( ) Inter First( ) doit être {} Règles

28 Éliminer les conflits LL(1) cachés Name = [ ident "." ] ident. Où est le conflit et comment léliminer? Name = ident [ "." ident ]. Cette nouvelle production est elle LL(1) ? Nous devons vérifier si First("." ident) Intersection Follow(Name) = {} Prog = Declarations ";" Statements. Declarations = D { ";" D }. Où est le conflit et comment léliminer? Remplacer Declarations dans Prog Prog = D { ";" D } ";" Statements. First(";" D) Inter First(";" Statements) # {} Prog = D ";" { D ";" } Statements. Nous devons encore vérifier si First(D ";") Inter First(Statements) = {}

29 Problème des Else L instruction If en Java Statement="if" "(" Expr ")" Statement [ "else" Statement ] |.... Cest un conflit LL(1) ! First("else" Statement) Inter Follow(Statement) = {"else"} Cest même une ambiguïté qui ne peut être éliminée if (expr1) if (expr2) stat1; else stat2; Statement On peut construire 2 arbres syntaxiques différents!

30 Problème des Else if (expr1) if (expr2) stat1; else stat2; Statement Statement="if" "(" Expr ")" Statement [ "else" Statement ] |.... Si la prochaine unité est "else" Lanalyseur prend comme option: le "else" est associé au dernier "if" Solution

31 Autres exigences pour une grammaire (Pré conditions pour les analyseurs syntaxiques) Complétude Pour chaque NTS il doit y avoir une production Non-circularité Un NTS ne doit pas être dérivable (directement ou pas) en lui-même (A => B 1 => B 2 =>... => A) A = a b | B. B = b b | A. erreur! cette grammaire est circulaire car A => B => A Dérivabilité Chaque NTS doit être dérivable (directement ou indirectement) en une chaîne de TS A = a B | c. B = b B. erreur! B ne peut être dérivé en une chaîne de TS A = a B C. B = b b. erreur! pas de production pour C

32 Analyse syntaxique Grammaires contexte-libre et Automates à pile(PDA Analyse descendante récursive Propriétés LL(1) Traitement des erreurs

33 Objectifs du traitement des erreurs syntaxiques Exigences 1.Déterminer le maximum derreurs en une seule compilation 2.Pas de bug (quelque soit lerreur) 3.Ne pas ralentir lexécution en traitant les erreurs 4.Ne pas gonfler le code Techniques pour lanalyse descendante récursive Mode panique Utilisation des symboles de reprise (ancres) Utilisation des symboles spéciaux de reprise

34 Mode panique L'analyseur abandonne après la première erreur static void Error (string msg) { Console.WriteLine("-- line {0}, col {1}: {2}", laToken.line, laToken.col, msg); throw new Exception("Panic Mode - exiting after first error"); } Avantages économique suffisant pour les langages de commandes ou pour les interpréteurs Inconvénients Non appropriée pour la production des compilateurs de qualité

35 Traitement des erreurs utilisant les ancres Exemple Entrée attendue: a b c d... Entrée réelle: a x y d... Récupération (synchronise lentrée restante avec la grammaire) 1.Trouver l "unité de reprise " (ancre) avec laquelle lanalyseur peut continuer après lerreur. Quelles sont les unités avec lesquelles lanalyseur peut continuer dans la situation donnée? csuccesseur de b (qui était attendu à la position de lerreur) dsuccesseur de b c... Les unités de reprise (ancre) à cette position sont {c, d,...} 2.Sauter les unités jusquà ce que une unité de reprise soit trouvée. x et y sont sautées dans lexemple, mais d est un ancre; lanalyseur peut continuer avec. 3. Conduire l'analyseur à la position dans la grammaire où il peut continuer. (remonter dans larbre syntaxique)

36 Détermination des ancres Chaque méthode danalyse dun non terminal A possède les successeurs courant de A comme paramètres static void A (BitArray sux) {... } sux...successeurs de tous les NTS, qui sont en exécution aAb Beof... bCd Beof e aAf... Dépendant du contexte courant, sux A peut dénoter différents ensembles sux A = {b, eof}sux A = {f, d, e, eof} sux contient toujours eof (le successeur du symbole de départ)

37 Traitement des symboles terminaux A =... a s 1 s 2... s n. check(a, sux A Union First(s 1 ) Union First(s 2 )... Union First(s n )); GrammaireAction de lanalyseur Peut être déterminé au moment de la compilation Doit être déterminé au moment de lexécution static void Check (int expected, BitArray sux) {...} Exemple A = a b c. static void A (BitArray sux) { Check(a, Add(sux, fs1)); Check(b, Add(sux, fs2)); Check(c, sux); } static BitArray Add (BitArray a, BitArray b) { BitArray c = (BitArray) a.Clone(); c.Or(b); return c; } static BitArray fs1 = new BitArray(); fs1[b] = true; fs1[c] = true; Rempli au début du programme s i : TS ou NTS

38 Traitement des symboles non terminaux A =... B s 1 s 2... s n. B(sux A Union First(s 1 ) Union First(s 2 )... Union First(s n )); GrammaireAction de lanalyseur Exemple A = a B c. B = b b. static void A (BitArray sux) { Check(a, Add(sux, fs3)); B(Add(sux, fs4)); Check(c, sux); } static void B (BitArray sux) { Check(b, Add(sux, fs5)); Check(b, sux); } fs3 = {b, c} fs4 = {c} fs5 = {b} La méthode danalyse pour laxiome S est appelée S(fs0); où fs0 = {eof}

39 Sauter les unités invalides Les erreurs sont détectées dans check() static void Check (int expected, BitArray sux) { if (la == expected) Scan(); else Error(Token.names[expected] + " expected", sux); } Après laffichage du message les unités sont sautées jusquà la rencontre dune unité de reprise static void Error (string msg, BitArray sux) { Console.WriteLine("-- line {0}, col {1}: {2}", laToken.line, laToken.col, msg); errors++; while (!sux[la]) Scan(); // while (la # sux) Scan(); } static int errors = 0; // number of syntax errors detected

40 Synchronisation avec la grammaire Exemple A = a B e. B = b c d. static void A (BitArray sux) { Check(a, Add(sux, fs1)); B(Add(sux, fs2)); Check(e, sux); } static void B (BitArray sux) { Check(b, Add(sux, fs3)); Check(c, Add(sux, fs4)); Check(d, sux); } Lerreur est détecté ici; ancres = {d, e, eof} 1.x est sauté; la == e ( dans ancres) 2.Lanalyseur continue: Check(d, sux); 3.Détecte de nouveau une erreur; ancres = {e, eof} 4.aucune unité est sautée, car la == e (dans ancres) 5.Lanalyseur retourne de B() et lance Check(e, sux); 6.Recouvrement réussi! bcd Bae Aeof baxe Entrée sux A = {eof} sux B = {e, eof} Une fois lerreur détectée lanalyseur avance jusquà trouver un endroit dans la grammaire qui concorde avec lunité courante.

41 Supprimer les faux messages derreur Durant le recouvrement de lerreur lanalyseur produit des faux messages derreur Résolu par une simple heuristique Si moins de 3 unités sont reconnues correctement depuis la dernière erreur, l'analyseur suppose que la nouvelle erreur est une fausse erreur. Les fausses erreurs ne sont pas affichées static int errDist = 3; // next error should be reported static void Scan () {... errDist++; // one more token recognized } public static void Error (string msg, BitArray sux) { if (errDist >= 3) { Console.WriteLine("-- line {0}, col {1}: {2}", laToken.line, laToken.col, msg); errors++; } while (!sux[la]) Scan(); errDist = 0; // counting is restarted }

42 Traitement des alternatives A = | |.,, sont des expressions EBNF static void A (BitArray sux) { // the error check is already done here so that the parser can synchronize with // the starts of the alternatives in case of an error if (la not in (First( ) Or First( ) Or First( ))) Error("invalid A", sux Or First( ) Or First( ) Or First( )); // la matches one of the alternatives or is a legal successor of A if (la in First( ))... parse... else if (la in First( ))... parse... else... parse... // no error check here; any errors have already been reported } First( ) Or First( ) Or First( )peut être déterminé au moment de la compilation sux Or... est déterminé au moment de lexécution

43 Traitement des Options et Itérations EBNF Options A = [ ]. static void A (BitArray sux) { // error check already done here, so that the parser can // synchronize with the start of in case of an error if (la not in (First( ) Or First( ))) Error("...", sux Or First( ) Or First( )); // la matches or or is a successor of A if (la in First( ))... parse...;... parse... } Itérations A = { }. static void A (BitArray sux) { for (;;) { // the loop is entered even if la not in First( ) if (la in First( ))... parse...;// correct case 1 else if (la in First( ) Or sux) break;// correct case 2 else Error("...", sux Or First(a) Or First(b));// error case }... parse... }

44 Exemple A = a B | b {c d}. B = [b] d. static void A (BitArray sux) { if (la != a && la != b) Error("invalid A", Add(sux, fs1)); // fs1 = {a, b} if (la == a) { Scan(); B(sux); } else if (la == b) { Scan(); for (;;) { if (la == c) { Scan(); Check(d, Add(sux, fs2)); // fs2 = {c} } else if (sux[la]) { break; } else { Error("c expected", Add(sux, fs2)); } static void B (BitArray sux) { if (la != b && la != d) Error("invalid B", Add(sux, fs3)); // fs3 = {b, d} if (la == b) Scan(); Check(d, sux); }

45 En résumé Avantage + applicable automatiquement Inconvénients -Ralentit lanalyse - gonfle le code de lanalyseur -complexe Traitement des erreurs avec des symboles de reprises (ancres)

46 Traitement des erreurs avec des ancres spéciaux Le traitement est seulement fait à des positions particulières Les mot-clés apparaissent à des positions uniques dans la grammaire Exemple Début dinstruction: if, while, do,... Début de déclaration: public, static, void,... Problème: ident peut figurer à plusieurs endroits! ident nest pas un ancre sûr. Il est donc omis de lensemble des ancres Ensemble dancres Pas besoin de passer les ensembles successeur aux méthodes de lanalyseur Les ensembles dancres sont connus avant lexécution Après une erreur lanalyseur ignore des unités jusquau prochain point de synchronisation Code à insérer aux points de synchronisation... if (la not in expectedSymbols) { Error("..."); // no successor sets; no skipping of tokens in Error() while (la not in (expectedSymbols Or {eof})) Scan(); }... Lensemble des ancres à ce point de synchronisation Pour éviter la boucle infinie

47 Exemple Synchronisation au début dune instruction static void Statement () { if (!firstStat[la]) { Error("invalid start of statement"); while (!firstStat[la] && la != Token.EOF) Scan(); errDist = 0; } if (la == Token.IF) { Scan(); Check(Token.LPAR); Conditions(); Check(Token.RPAR); Statement(); if (la == Token.ELSE) { Scan(); Statement(); } } else if (la == Token.WHILE) {... } static BitArray firstStat = new BitArray(); firstStat[Token.WHILE] = true; firstStat[Token.IF] = true;... le reste de lanalyseur reste inchangé (comme sil n y a pas de traitement derreur) Pas de synchronisation dans Error() public static void Error (string msg) { if (errDist >= 3) { Console.WriteLine("-- line {0}, col {1}: {2}", laToken.line, laToken.col, msg); errors++; } errDist = 0; } heuristics with errDist can also be applied here

48 Exemple de recouvrement static void Statement () { if (!firstStat[la]) { Error("invalid start of statement"); while (!firstStat[la] && la != Token.EOF) Scan(); errDist = 0; } if (la == Token.IF) { Scan(); Check(Token.LPAR); Condition(); Check(Token.RPAR); Statement(); if (la == Token.ELSE) { Scan(); Statement(); }... } static void Check (int expected) { if (la == expected) Scan(); else Error(...); } Entrée erronée: if a > b then max = a; ifScan();if dans firstStat, ok aCheck(LPAR);message derreur: ( attendue Condition();reconnaît a > b thencheck(RPAR);message derreur: ) attendue Statement();then ne correspond pas, donc erreur, mais pas de message derreur then est sauté; synchronisation avec ident (si dans firstStat) max laaction public static void Error (string msg) { if (errDist >= 3) { Console.WriteLine(...); errors++; } errDist = 0; }

49 Synchronisation au début dune itération Exemple Block = "{" { Statement } "}". Modèle standard dans ce cas static void Block () { Check(Token.LBRACE); while (firstStat[la]) Statement(); Check(Token.RBRACE); } Problème:si la prochaine unité ne correspond pas à une instruction la boucle nest pas exécutée. Le point de synchronisation dans Statement nest jamais atteint.

50 Synchronisation au début dune itération Exemple Block = "{" { Statement } "}". Cest meilleur de synchroniser au début de litération static void Block() { Check(Token.LBRACE); for (;;) { if (la in First(Statement)) Statement();// correct case 1 else if (la in {rbrace, eof}) break;// correct case 2 else {// error case Error("invalid start of Statement"); do Scan(); while (la (First(Statement) union {rbrace, eof})); errDist = 0; } Check(Token.RBRACE); } Pas de synchronisation dans Statement() static void Statement () { if (la == Token.IF) { Scan();... }

51 En résumé Avantages +ne ralentit pas lexécution de lanalyseur +ne gonfle pas le code de lanalyseur +simple Inconvénients -demande plus dexpérience Traitement des erreurs avec des symboles de reprises spéciaux


Télécharger ppt "Analyse syntaxique Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)"

Présentations similaires


Annonces Google