Traitement smantique et grammaire dattributs Pr ZEGOUR DJAMEL
Traitement sémantique et grammaire d’attributs Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI) http: //zegour. esi. dz/ email: d_zegour@esi. dz
Traitement Sémantique et grammaire d‘attributs Traitement sémantique Grammaires d’attributs (ATG) Transformations des ATG en un analyseur Exemples d’applications
Traitement sémantique L‘analyseur syntaxique vérifie uniquement la syntaxe d‘un 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 l’analyseur syntaxique et sont décrites avec les grammaires d’attribut
Actions sémantiques Plus loin : Analyse de l’entrée Expr = Term { "+" Term }. L’analyseur syntaxique vérifie si l’entrée est syntaxiquement correcte. Maintenant : Traduction de l’entrée (Traitement sémantique ) Ex. : Compter les termes dans une expression Expr = Term (. int n = 1; . ) { "+" Term (. n++; . ) } (. Console. Write. Line(n); . ). "traduction" : 1+2+3 47+1 909 3 2 1 Actions sémantiques Instructions Java entre (. et. ) Sont exécuté par l’analyseur aux positions où elles apparaissent dans la grammaire
Traitement Sémantique et grammaire d‘attribut Traitement sémantique Grammaires d’attributs (ATG) Transformations des ATG en un analyseur Exemples d’applications
Attributs Les symboles non terminaux peuvent retourner des valeurs ( paramètres de sortie) Term < int val> Term retourne sa valeur numérique comme un attribut de sortie Les attributs sont utiles dans le processus de traduction Ex. : Calculer la valeur d’une expression Expr = Term< sum> { "+" Term< val> }. (. int sum, val; . ) (. sum += val; . ) (. Console. Write. Line(sum); . ) "traduction" 1+2+3 47+1 909 6 48 909
Attributs d’entrée Les symboles non terminaux peuvent aussi avoir des attributs d’entrée (paramètres d’entrée )) Expr< bool print. Hex> Afficher le résultat de l’addition hexadécimale si l’attribut d’entrée print. Hex est vrai sinon le décimal Exemple Expr< bool print. Hex> = Term< sum> { "+" Term< val> }. (. int sum, val; . ) (. sum += val; . ) (. if (print. Hex) Console. Write. Line("{0: X}", sum) else Console. Write. Line("{0: D}", sum); . )
Grammaires d’attributs (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) Attributs d’entrée : passer le résultat de la traduction Term< int val> Expr< bool print. Hex> Attributs de sortie : fournit un contexte à partir de l’appelant 3. Actions sémantiques (. . Instructions C# Java ou autre. . )
Exemple ATG pour les traitement des déclarations Var. Decl = Type < type> Ident. List < type> "; ". (. Struct type; . ) Ident. LIst < Struct type> = ident (. Tab. insert(token. str, type); . ) { ", " ident (. Tab. insert(token. str, type); . ) }. Ceci est traduit vers les procédures d’analyse suivantes : static void Var. Decl () { Struct type; Type(out type); Ident. List(type); Check(Token. SEMICOLON); } static void Ident. List (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 d’analyse
Exemple: Traitement des expressions de constantes Entrée Résultat désiré : : 3 * (2 + 4) 18 Expr < int val> = Term < val> { "+" Term < val 1> | "-" Term < val 1> }. (. int val 1; . ) Expr Term (. val += val 1; . ) (. val -= val 1; . ) 18 18 Factor (. int val 1; . ) Term < int val> = Factor < val> { "*" Factor < val 1> (. val *= val 1; . ) | "/" Factor < val 1> (. val /= val 1; . ) } Factor < int val> = number | "(" Expr < val> ")" (. int val 1; . ) (. val = token. val; . ) Expr Term Factor 3 ( 2 4 Factor 2 * 6 Term 2 Factor 3 6 + 4 4 )
Traitement Sémantique et grammaire d‘attribut Traitement sémantique Grammaires d’attributs (ATG) Transformations des ATG en un analyseur Exemples d’applications
Transformation d’une ATG en procédures Production Expr< int val> (. int val 1; . ) = Term< val> { "+" Term< val 1> (. val += val 1; . ) | "-" Term< val 1> (. val -= val 1; . ) }. Procédures d‘analyse static void Expr (int val) { int val 1; Term(val); for (; ; ) { if (la == Token. PLUS) { Scan(); Term(val 1); val += val 1; } else if (la == Token. MINUS) { Scan(); Term(val 1); val -= val 1; } else break; } } Actions sémantique: code Java Les terminaux n’ont pas d’attributs d’entrée. Pour l’ATG considérée, les terminaux n’ont pas non plus d’attribut de sortie, mais leurs valeurs sont déterminées par token. str or token. val.
Traitement Sémantique et grammaire d‘attribut Traitement sémantique Grammaires d’attributs (ATG) Transformations des ATG en un analyseur Exemples d’applications
Exemple: Statistiques des ventes Les ATGs peuvent aussi être utilisées dans d’autres domaines Exemple: étant donné un fichier avec des nombres des ventes File Article Code Amount = { Article }. = Code { Amount } "END" = number. Exemple d’entrée 3451 3452 3453. . . 2 5 3 7 END 4 8 1 END 1 1 END Sortie désirée 3451 3452 3453. . . 17 13 2 Si l'entrée est syntaxiquement structuré alors les ATGs sont une bonne notation pour décrire son traitement
ATG pour les statistiques des ventes File = { Article< code, amount> }. (. int code, amount; . ) (. Write(code + " " + amount); . ) Article< int code, int amount> = Value< code> { (. int x; . ) Value< x> (. amount += x; . ) } "END". Value< int x> = number. (. x = token. val; . ) Code de l’analyseur 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; } Symboles terminaux : number, end, eof
Exemple: Langage de Description des Images décrite par: (50, 90) (40, 45) (10, 40) (50, 0) POLY (10, 40) (50, 90) (40, 45) (50, 0) END Syntaxe: Polygon = "POLY" Point {Point} "END". Point = "(" number ", " number ")". Nous voulons un programme qui lit l’entrée et dessine le polygone Polygon = "POLY" Point< p> { ", " Point< q> } "END". (. Pt p, q; . ) Point< p> = "(" number ", " number ")". (. Pt p; int x, y; . ) (. x = t. val; . ) (. y = t. val; . ) (. p = new Pt(x, y); . ) (. Turtle. start(p); . ) (. Turtle. move(q); . ) (. Turtle. move(p); . ) 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*2 342*+ (3 + 4) * 2 34+2* Expr = Term { "+" Term | "-" Term } Term = Factor { "*" Factor | "/" Factor }. Expr (. Write("+"); . ) (. Write("-"); . ) Write + Term Factor (. Write("*"); . ) (. Write("/"); . ) Factor = number (. Write(token. val); . ) | "(" Expr ")". 3 Write 3 + Term Factor 4 Write * Factor * 2 Write 2
- Slides: 17