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

Table des symboles Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)

Présentations similaires


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

1 Table des symboles Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)

2 Table des symboles Introduction Symboles Portée des symboles Types Univers

3 Rôles de la table des symboles 1. Elle range tous les noms déclarés avec leurs attributs type valeur (pour les constantes) adresse (pour les variables locales et les paramètres de procédures) paramètre (pour les procédures) Elle est utilisée pour retrouver les attributs dun nom Fonction : nom (type, value, adresse,...) Contenu de la table des symboles Les nœuds de symbole : information sur les noms déclarés Les nœuds de Structure : information sur les types déclarés Cest plus commode de limplémenter par une structure de données dynamique : - liste linéaire chaînée - arbre binaire - Hash-code

4 Table des symboles comme une liste Soient les déclarations suivantes const int n = 10; class T {... } int a, b, c; void M () {... } Nous obtenons la liste linéaire chaînée suivante Pour chaque nom déclaré il existe un nœud de symbole +simple +lordre des déclarations est retenu (important si les adresses sont attribuées plus tard) -lent sil existe beaucoup de déclarations Interface de base public class Tab { public static Symbol Insert (Symbol.Kinds kind, string name,...); public static Symbol Find (string name); } "n" Const "T" Type "a" Field "b" Field "c" Field "M" Meth

5 Table des symboles comme un arbre binaire Déclarations const int n = 10; class T {... } int a, b, c; void M () {... } Arbre binaire résultant +rapide - larbre peut dégénérer sauf sil est équilibré - Consommation de la mémoire - lordre des déclarations est perdu Utile seulement sil y a beaucoup de déclarations "n" Const "M" Meth "b" Field "c" Field "a" Field "T" Type

6 Table des symboles comme une table hash-code Déclarations const int n = 10; class T {... } int a, b, c; void M () {... } Table hash-code résultante +rapide - plus compliqué quune liste - lordre des déclarations est perdu Pour notre propos une liste est suffisante Chaque étendue (portée) est une liste de ses propres déclarations Une étendue a à peine plus de 10 noms "n" Const "M" Meth "b" Field "c" Field "a" Field "T" Type

7 Table des symboles Introduction Symboles Portée des symboles Types Univers

8 Les nœuds de symbole Chaque nœud déclaré est rangé dans un nœud de symbole Sortes courants de symboles constantes variables globales champs paramètres variables locales types méthodes programme public enum Kinds { Const, Global, Field, Arg, Local, Type, Meth, Prog } Quelles sont les informations désirées sur les objets? pour tous les symbolesnom, type structuré, sorte de symbole,.. pour les constantesvaleur pour les paramètresadresse (= ordre de déclaration) pour les variables locales adresse (= ordre de déclaration) pour les méthodesnombre darguments et variables locales, symboles locaux (paramètres + variables locales) pour le programmesymboles globaux(= locaux au programme) pour les variables globales, champs, types, ….

9 La classe des symboles class Symbol { public enum Kinds { Const, Global, Field, Arg, Local, Type, Meth, Prog } Kindskind; stringname; Structtype; Symbolnext; intval;// Const: value intadr;// Arg, Local: address intnArgs;// Meth: number of arguments intnLocs;// Meth: number of local variables Symbollocals;// Meth: parameters & local variables; Prog: symbol table of program } Const "n" 10 - const int n = 10; class T {... } int a, b; void M (int x, int y) char ch; {... } kind name next val adr nArgs nLocs locals Type "T" - Global "a" - Global "b" - Meth "M" Arg "x" Exemple Local "ch" Arg "y" Défini plus loin

10 Introduction des noms dans la table des symboles La méthode suivante est appelée quand un nom est déclaré Symbol sym = Tab.Insert(kind, name, type); Crée un nouveau nœud dobjet avec kind, name, type Vérifie si name est déjà déclaré (si cest le cas => message derreur) Attribuer des adresses successives aux variables et champs Entrer le niveau de déclaration pour les variables (Global, Local,…) Ajouter le nouveau nœud en fin de la liste linéaire des symboles Retourner le nouveau nœud à lappelant Exemple dappel à la méthode Insert() VarDecl =Type ident(. Tab.insert(kind, name, type);.) { ";" ident(. Tab.insert(kind, name, type);.) }.

11 Les symboles (noms) prédéfinis Exemples de noms prédéfinis ? Types standards : int, char Constants standards : null Fonctions Standards : ord(ch), chr(i), len(arr) On peut aussi ranger les noms prédéfinis dans la table des symboles ("Univers") kind name val adr nArgs nLocs locals Type "int" - Type "char" - Const "null" 0 - Meth "ord" Meth "chr" Meth "len" kind name val adr nArgs nLocs locals Arg "ch" Arg "i" Arg "arr" - 0 -

12 Noms spéciaux comme des mot-clés int et char peuvent aussi être implémentées comme des mot-clés. Exige un traitement spécial dans la grammaire Type =ident(. Symbol sym = Tab.Find(token.str); type = sym.type;.) |"int"(. type = Tab.intType;.) |"char"(. type = Tab.charType;.). Cest plus simple de les avoir pré déclarés dans la table des symboles Type =ident(. Symbol sym = Tab.Find(token.str); type = sym.type;.) +traitement uniforme pour les noms pré déclarés et les noms utilisateur -on peut re déclarer "int" comme un type utilisateur

13 Table des symboles Introduction Symboles Portée des symboles Types Univers

14 Portée = Domaine où lobjet est valide(connu) Il y a des portées séparées (listes dobjets) pour L "univers"contient les noms pré définis ( on ajoute le symbole P pour programme) Le programmecontient noms globaux (= constantes, variables globales, classes, méthodes) Chaque méthodecontient les noms locaux (= arguments et variables locales) Chaque classecontient des champs Exemple class P int a, b; { void M (int x) int b, c; {... }... } Portée M (tous les noms déclarés dans M) Portée P (tous les noms déclarés dans P) univers (noms pré déclarés) La recherche dun nom commence toujours dans topScope Si non trouvé, la recherche continue dans la prochaine portée englobante (outer) Exemple: rechercher b, a et int "x" locals "b""c" "a""b""M" outer "int""char""P" topScope...

15 Les nœuds dune portée class Scope { Scopeouter;// vers la portée englobante Symbollocals;// vers les symboles de cette portée intnArgs;// nombre of arguments de cette portée (pour lattribution des adresses) intnLocs;// nombre de variables locales dans cette portée (pour lattribution des adresses) } Méthode pour louverture dune portée static void OpenScope () { // in class Tab Scope s = new Scope(); s.nArgs = 0; s.nLocs = 0; s.outer = topScope; topScope = s; } Appelée au début dune méthode ou une classe Relie la nouvelle portée avec celles existantes La nouvelle portée devient topScope Tab.Insert() crée toujours des symboles dans topScope Méthode pour la fermeture dune portée static void CloseScope () { // in class Tab topScope = topScope.outer; } Appelée à la fin dune méthode ou une classe La prochaine portée englobante(outer) devient topScope

16 Introduction des noms dans une portée Les noms sont toujours introduit dans topScope class Tab { static Scope topScope;// pointer to current scope... static Symbol Insert (Symbol.Kinds kind, string name, Struct type) { //--- create symbol node Symbol sym = new Symbol(name, kind, type); if (kind == Symbol.Kinds.Arg) sym.adr = topScope.nArgs++; else if (kind == Symbol.Kinds.Local) sym.adr = topScope.nLocs++; //--- insert symbol node Symbol cur = topScope.locals, last = null; while (cur != null) { if (cur.name == name) Error(name + " declared twice"); last = cur; cur = cur.next; } if (last == null) topScope.locals = sym; else last.next = sym; return sym; }... } Struct : Défini plus loin

17 Ouverture et fermeture dune portée Remarques Le nom de la méthode est introduit dans la portée englobant la méthode Avant de fermer une portée, les objets locaux sont attribués au champ locals de la méthode en cours Même principe pour les classes(les portées sont aussi ouvertes et fermés pour les classes) MethodDecl(. Struct type;.) =Type ident(.curMethod = Tab.insert(Symbol.Kinds.Meth, token.str, type); Tab.OpenScope();.)... "{"... "}"(.curMethod.nArgs = topScope.nArgs; curMethod.nLocs = topScope.nLocs; curMethod.locals = Tab.topScope.locals; Tab.CloseScope();.). variable globale

18 Exemple class P "int""char""P" topScope Tab.OpenScope();...

19 Exemple class P int a, b; { "a""b" topScope Tab.Insert(..., "a",...); Tab.Insert(..., "b",...); "int""char""P"...

20 Exemple class P int a, b; { void M () topScope Tab.Insert(..., "M",...); Tab.OpenScope(); "M" "a""b" "int""char""P"...

21 Exemple class P int a, b; { void M () int x, y; topScope Tab.Insert(..., "x",...); Tab.Insert(..., "y",...); "x""y" "M""a""b" "int""char""P"...

22 Exemple class P int a, b; { void M () int x, y; {... } topScope "x" "y" meth.locals = Tab.topScope.locals; Tab.CloseScope(); "M""a""b" "int""char""P"...

23 Exemple class P int a, b; { void M () int x, y; {... }... } topScopeprog.locals = Tab.topScope.locals; Tab.CloseScope(); "x" "y" "M""a""b" "int""char""P"...

24 Recherche des noms dans la table des symboles La méthode suivante est appelée quand un nom est utilisé Symbol sym = Tab.Find(name); Si un nom est non trouvé la méthode retourne un symbole spécial : noSym Symbole pré déclaré Mieux que null, car il évite les effets de bord (exceptions) kind name type val adr nArgs nLocs locals Const "noSymbol" 0 noSym noType static Symbol Find (string name) { for (Scope s = topScope; s != null; s = s.outer) for (Symbol sym = s.locals; sym != null; sym = sym.next) if (sym.name == name) return sym; Parser.Error(name + " is undeclared"); return noSym; } La recherche commence dans topScope Si non trouvé, la recherche continue dans la portée englobante (pointeur outer ) xbc locals abm outer intchar topScope

25 Table des symboles Introduction Symboles Portée des symboles Types Univers

26 Les types Chaque objet a un type avec les propriétés suivantes taille structure (champs pour les classes, type des éléments pour les tableaux,...) Sortes de types ? types primitives ( int, char ) tableaux classes Les types sont représentés par des nœuds de structure class Struct { public enum Kinds { None, Int, Char, Arr, Class } Kindskind; StructelemType;// Arr: element type Symbol fields;// Class: list of fields }

27 Nœuds de structure pour les types primitifs Nœud dobjet Nœud de structure Il existe un seul nœud de structure pour le type int dans toute la table des symboles. Tous les symboles de type int référencent celui-ci. Même chose pour le nœud de structure correspondant au type char. Local "a" int a, b; char c; kind name type next val adr nArgs nVars locals Local "b" Local "c" kind elemType fields Int - Char -

28 Nœuds de structure pour les tableaux La longueur dun tableau peut ne pas être connue au moment de la compilation. Elle sera déterminée à lexécution. Local "a" int[] a; int b; kind name type next val adr nArgs nVars locals Local "b" kind elemType fields Arr - Int -

29 Nœuds de structure pour les classes Field "x" - Type "C" - class C { int x; int y; int z; } C v; kind name type next val adr nArgs nVars locals Global "v" - kind elemType fields Class - Int - kind name type next val adr nArgs nVars locals Field "y" - Field "z" -

30 Table des symboles Introduction Symboles Portée des symboles Types Univers

31 Structure de l "univers" kind name type val adr nArgs nLocs locals Type "int" - Type "char" - Const "null" 0 - Meth "chr" Meth "ord" Meth "len" Arg "i" Arg "ch" Arg "arr" Int - Char - Class - Arr - Const "noSymbol" 0 - None - intTypecharTypenullTypenoType chrSymordSymlenSymnoSym kind elemType fields

32 Interface de la table des symboles class Tab { static ScopetopScope;// current top scope static StructintType;// predefined types static StructcharType; static StructnullType; static StructnoType; static SymbolchrSym;// predefined symbols static SymbolordSym; static SymbollenSym; static SymbolnoSym; static SymbolInsert (Symbol.Kinds kind, string name, Struct type) {...} static SymbolFind (string name) {...} static voidOpenScope () {...} static voidCloseScope () {...} static voidInit () {...}// builds the universe and initializes Tab }


Télécharger ppt "Table des symboles Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)"

Présentations similaires


Annonces Google