Traitement sémantique et grammaire dattributs Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)
Traitement Sémantique et grammaire dattributs Traitement sémantique Grammaires dattributs (ATG) Transformations des ATG en un analyseur Exemples dapplications
Traitement sémantique Lanalyseur syntaxique vérifie uniquement la syntaxe dun programme Taches du traitement sémantique Gestion de la table des symboles -Maintient les informations sur les noms déclarés -Maintient les informations sur les types -Maintient la portée des noms Vérifie les conditions de contexte -Gère la portée des noms -Vérifie les types Invocation des routines de génération de code Les actions sémantiques sont intégrées dans lanalyseur syntaxique et sont décrites avec les grammaires dattribut
Actions sémantiques Plus loin : Analyse de lentrée Expr = Term { "+" Term }. Lanalyseur syntaxique vérifie si lentrée est syntaxiquement correcte. Maintenant : Traduction de lentrée (Traitement sémantique ) Expr = Term(. int n = 1;.) { "+" Term(. n++;.) }(. Console.WriteLine(n);.). Ex.: Compter les termes dans une expression Actions sémantiques Instructions Java entre (. et.) Sont exécuté par lanalyseur aux positions où elles apparaissent dans la grammaire "traduction" :
Traitement Sémantique et grammaire dattribut Traitement sémantique Grammaires dattributs (ATG) Transformations des ATG en un analyseur Exemples dapplications
Attributs Les symboles non terminaux peuvent retourner des valeurs ( paramètres de sortie) Term Term retourne sa valeur numérique comme un attribut de sortie Les attributs sont utiles dans le processus de traduction Ex.: Calculer la valeur dune expression Expr (. int sum, val;.) =Term { "+" Term (. sum += val;.) }(. Console.WriteLine(sum);.). "traduction"
Attributs dentrée Les symboles non terminaux peuvent aussi avoir des attributs dentrée (paramètres dentrée )) Expr Afficher le résultat de laddition hexadécimale si lattribut dentrée printHex est vrai sinon le décimal Exemple Expr (. int sum, val;.) =Term { "+" Term (. sum += val;.) }.(.if (printHex) Console.WriteLine("{0:X}", sum) else Console.WriteLine("{0:D}", sum);.)
Grammaires dattributs (ATG) Notation pour décrire le traitement de traduction Trois parties : 1.Productions en EBNF Expr = Term { "+" Term }. 2.Attributs (paramètres des symboles non terminaux) Term Expr Attributs dentrée : passer le résultat de la traduction Attributs de sortie : fournit un contexte à partir de lappelant 3.Actions sémantiques (.... Instructions C# Java ou autre....)
Exemple ATG pour les traitement des déclarations VarDecl =Type IdentList ";". IdentLIst =ident { "," ident }. (. Struct type;.) (. Tab.insert(token.str, type);.) Ceci est traduit vers les procédures danalyse suivantes : static void VarDecl () { Struct type; Type(out type); IdentList(type); Check(Token.SEMICOLON); } static void IdentList (Struct type) { Check(Token.IDENT); Tab.Insert(token.str, type); while (la == Token.COMMA) { Scan(); Check(Token.IDENT); Tab.Insert(token.str, type); } Les ATG sont plus concises et plus Lisibles que les procédures danalyse
Exemple: Traitement des expressions de constantes Entrée:3 * (2 + 4) Résultat désiré:18 Expr =Term { "+" Term | "-" Term }. Term =Factor { "*" Factor | "/" Factor } Factor =number |"(" Expr ")" (. int val1;.) (. val += val1;.) (. val -= val1;.) (. int val1;.) (. val *= val1;.) (. val /= val1;.) (. int val1;.) (. val = token.val;.) Factor *(2 +4 ) Term Expr Factor Term Expr
Traitement Sémantique et grammaire dattribut Traitement sémantique Grammaires dattributs (ATG) Transformations des ATG en un analyseur Exemples dapplications
Transformation dune ATG en procédures Expr (. int val1;.) =Term { "+" Term (. val += val1;.) | "-" Term (. val -= val1;.) }. Production static void Expr (int val) { int val1; Term(val); for (;;) { if (la == Token.PLUS) { Scan(); Term(val1); val += val1; } else if (la == Token.MINUS) { Scan(); Term(val1); val -= val1; } else break; } Procédures danalyse Actions sémantique: code Java Les terminaux nont pas dattributs dentrée. Pour lATG considérée, les terminaux nont pas non plus dattribut de sortie, mais leurs valeurs sont déterminées par token.str or token.val.
Traitement Sémantique et grammaire dattribut Traitement sémantique Grammaires dattributs (ATG) Transformations des ATG en un analyseur Exemples dapplications
Exemple: Statistiques des ventes Les ATGs peuvent aussi être utilisées dans dautres domaines Exemple: étant donné un fichier avec des nombres des ventes File= { Article }. Article= Code { Amount } "END" Code= number. Amount= number. Si l'entrée est syntaxiquement structuré alors les ATGs sont une bonne notation pour décrire son traitement Exemple dentrée END END END... Sortie désirée
ATG pour les statistiques des ventes File(. int code, amount;.) ={ Article (. Write(code + " " + amount);.) }. Article =Value { (. int x;.) Value (. amount += x;.) } "END". Value = number(. x = token.val;.). static void File () { int code, amount; while (la == number) { Article(code, number); Write(code + " " + amount); } static void Article ( int code, int amount) { Value( code); while (la == number) { int x; Value( x); amount += x; } Check(end); } static void Value ( int x) { Check(number); x = token.val; } Code de lanalyseur Symboles terminaux : number, end, eof
Exemple: Langage de Description des Images décrite par: POLY (10,40) (50,90) (40,45) (50,0) END (10,40) (50,0) (40,45) (50,90) Syntaxe: Polygon = "POLY" Point {Point} "END". Point = "(" number "," number ")". Nous voulons un programme qui lit lentrée et dessine le polygone Polygon(. Pt p, q;.) ="POLY" Point (. Turtle.start(p);.) { "," Point (. Turtle.move(q);.) } "END"(. Turtle.move(p);.). Point (. Pt p; int x, y;.) ="(" number(. x = t.val;.) "," number(. y = t.val;.) ")"(. p = new Pt(x, y);.). Nous utilisons "Turtle Graphics" pour le dessin Turtle.start(p); positionne la tortue (stylo) au point p Turtle.move(q); déplace la tortue vers le point q tout en dessinant une ligne
Exemple: Transformation des expressions Infixées vers Postfixées Les expressions arithmétiques en notation infixe peuvent être transformées en notation post fixe * * + (3 + 4) * * Expr = Term { "+" Term(. Write("+");.) | "-" Term(. Write("-");.) } Term = Factor { "*" Factor(. Write("*");.) | "/" Factor(. Write("/");.) }. Factor = number(. Write(token.val);.) |"(" Expr ")". 3 Factor +4 *2 Term Expr Term Write 3Write 4Write 2 Write * Write +