Structures simples et tableaux Pr ZEGOUR DJAMEL EDDINE
Structures simples et tableaux Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI) http: //zegour. esi. dz/ email: d_zegour@esi. dz
Structures simples et tableaux : Définitions n Structure = Enregistrement n Une structure simple est un ensemble d’éléments de types différents. Chaque type est simple (Entier, Booleen, Car, Chaine) n Un tableau est un ensemble d’éléments de même type. Chaque élément peut être de type simple ou du type structure simple. n Exemples Soit s 1 une structure (entier, boolean, car); Soit s 2 : (chaine, entier); Soit v 1 un vecteur(5, 6) de entiers; Soit v 2 un vecteur de (chaine, booleen);
Structures simples et tableaux : Représentation d’un tableau en mémoire (à l’exécution) Dimension Bornes Descriptif Zone de données Tableau
Structures simples et tableaux Représentation d’une structure simple en mémoire (à l’exécution) Zone de données Structure( adresse vers les valeurs des champs) Les différents champs
Représentation d'un tableau en mémoire n Déclaration : A(a 1: b 1; a 2: b 2; . . . an: bn) Ordre de rangement des sous tableaux A(i, *, *, . . . , *) : A(a 1, *, *, . . . , *), A(a 1+2, *, *, . . . , *), . . , A(b 1, *, *, . . . , *)
Représentation d'un tableau en mémoire A l'intérieur de chaque sous tableau A(i, *, *, . . , *), l'ordre suivant des sous-tableaux est considéré : A(i, a 2, *, *, . . . , *), A(i, a 2+1, *, *, . . . , *), A(i, a 2+2, *, *, . . . , *), . . . , A(i, b 2, *, *, . . . , *) Et ainsi de suite. . . Donc rangement de la matrice ligne par ligne. Ce sont les derniers indices qui varient le plus rapidement.
Représentation d'un tableau en mémoire Exemple pour un tableau A(3, 2, 3)
Représentation d'un tableau en mémoire Adresse d'un élément A(i 1, i 2. . , in) ? Posons di = bi - ai + 1 Adr de A(i 1, *, *, . . ) : AD 1 = Base + (i 1 -a 1) d 2 d 3. . . dn Adr de A(i 1, i 2, *, . . , *) : AD 2 = AD 1 + (i 2 -a 2)d 3 d 4. . . dn Adr de A(i 1, i 2, . . . in) : ADn = Base + (i 1 -a 1)d 2 d 3. . dn + (i 2 -a 2)d 3 d 4. . . dn +. . +(in-1 -an-1)dn + (in-an) Partie constante : Base -(a 1 i=2, ndi+ a 2 i=3, n di+. . . +an-1 dn + an) Partie variable : i 1 i=2, n di + i 2 i=3, ndi +. . . + in-1 dn + in
Représentation d'un tableau en mémoire Si a 1 = a 2 =. . . = an = 0, l‘adresse de A(i 1, i 2, . . . in) est i 1 d 2 d 3. . dn + i 2 d 3 d 4. . . dn +. . +in-1 dn + in Ou bien : j=1, n ( ij. i=j+1, n di ) didi+1. . . dn : facteur multiplicatif
Structure de TABOB (Statut, Type, Nombre, Adresse) avec n Statut qui peut être : 'L' : Variables locales 'X' : Variable auxiliaire de valeur créée par le compilateur 'Y' : Variable auxiliaire d'adresse créée par le compilateur 'C' : Constante entière, logique , pointeur, chaîne de caractères n Type : Indice vers la tables des types. ( 'W' pour NIL ) TABTYP : chaîne de caractères contenant tous les types Nombre : Longueur du type (nombre de caractères formant le type) n Adresse : n Adresse relative de l'objet dans la zone de données si le statut est 'L', 'X' ou 'Y' Rang dans la liste des constantes si le statut est 'C'
Sémantique des structures simples : Quadruplés n Au niveau des déclarations (Voir grammaire) (‘Ds’, A, B, C ) A : pointeur TABOB vers l’objet composé B, et C non utilisés Pour un objet composé, Statut=‘L’, Type= indice dans la table des types (TABTYP), Nombre=nombre de caractères formant le type, Adresse=adresse relative de l’objet dans la zone de données
Sémantique des structures simples : Quadruplés Manipulation: STRUCT(S, Rang), AFF_STRUCT(S, Rang, Exp), INIT_STRU CT(S, [Exp 1, Exp 2, …]) (‘Struct’, A, B, C ) A : pointeur dans TABOB vers l’objet composé B : numéro du champ C : pointeur dans TABOB vers le résultat de Struct (‘Aff_struct’, A, B, C ) B : numéro du champ C : pointeur dans TABOB vers la valeur à affecter (‘Init_struct’, A, B, C ) A : pointeur dans TABOB vers l’objet composé B : pointeur dans TABCOMP vers la liste des expressions scalaires C : nombre d’expressions
Sémantique des tableaux : Quadruplés n Au niveau des déclarations (Voir grammaire) (‘Dt’, A, B, C ) A : pointeur dans TABOB vers l’identificateur de tableau B : indice dans TABCOMP vers la liste des bornes D : dimension Pour un objet tableau, Statut=‘L’, Type= indice dans la table des types (TABTYP), Nombre=nombre de caractères formant le type, Adresse=adresse relative de l’objet dans la zone de données
Sémantique des tableaux : Quadruplés Au niveau des instructions AFF_ELEMENT(T[Exp 1, Exp 2, . . ], [[Exp 1, Exp 2, . . ]) : ELEMENT(T[Exp 1, Exp 2, . . ]), Exp), INIT_TABLEAU(T, (‘Element’, A, B, C ) A : pointeur TABOB vers l’identificateur de tableau B : pointeur dans TABCOMP vers la liste des expressions C : pointeur dans TABOB vers le résultat de Element (Aff_Element’, A, B, C ) A : pointeur TABOB vers l’identificateur de tableau B : pointeur dans TABCOMP vers la liste des expressions D : pointeur dans TABOB vers la valeur à affecter (‘Init_vect’, A, B, C ) A : pointeur TABOB vers l’identificateur de tableau B : pointeur dans TABCOMP vers la listes des expressions C : non utilisé
Structures simples et tableaux : Déclarations Types dans {Entier, Booleen, Car, Chaine} Sep dans { : , Une, Des} Cste désigne une constante numérique entière Chaîne : chaîne de caractères Idf désigne un identificateur Opr dans { <, <=, >, >=, =, <> } Opa dans { +, -, Ou } Opm dans { *, /, Et } Sign dans {+, -} Tableau est synonyme de Vecteur Init_tableau est synonyme de Init_vecteur
Structures simples et tableaux : Déclarations <Algo Z> [ ~Soit|Soient~ <Ps> ] Debut <Lis> Fin [; ] <Ps> <S>; { [~Soit|Soient~] <S>; }* <S> <Li>[Sep <Typ> ] <Li> Idf {, Idf}*
Structures simples et tableaux : Déclarations <Typ> Types | <Structsimple> | Tableau (<Lc>) [De~<Structsimple> | Types~ ] | <Structsimple> [Structure ](Types {, Types }*) <Lc> Cste {, Cste}*
Structures simples et tableaux : Instructions < Lis > < Inst > { ; < Inst > }* <Inst> Idf : = <Exp> | Lire ( Idf {, Idf }* ) | Ecrire (<Exp> {, <Exp>}* ) | Tantque <Exp> [ : ] <Lis> Fintantque | Si <Exp> [: ] <Lis> [Sinon <Lis>] Fsi | Pour Idf: = <Exp>, <Exp> [, <Exp>][: ] <Lis> Finpour
Structures simples et tableaux : Instructions <Inst> ~ Init_vecteur | Init_struct ~ ( Idf , [[ ~<Exp>|[[<Exp> {, <Exp>}*]] ~ {, ~<Exp>|[[<Exp> {, <Exp>}*]]~}* ]] ) | Aff_element (<Exp> [[ <Exp> {, <Exp> }* ]] , <Exp> ) | Aff_struct(Idf, Cste, <Exp>)
Structures simples et tableaux : Expressions <Exp> <Exps>[ Opr <Exps>] <Exps> <Terme> [Sign] <Terme> { Opa <Terme> }* <Facteur>{Opm <Facteur>}* <Facteur> Idf | Cste | ( <Exp>) | <Fonct> | Non <Facteur> | Vrai | Faux | Chaine <Fonct> Element ( <Fonct> [[ <Exp> {, <Exp> }* ]] ) | Struct ( Idf, Cste)
Sémantique d’une déclaration de structure: Fonctions sémantiques <Typ> [Structure ] (Types F 1 Faire Type=‘(‘+Types F 2 Faire Type= Type + Types F 3 Faire Type= Type + ‘)’ F 1 {, Types F 2 < Structure simple> }*) F 3
Sémantique d’une déclaration de tableau: Fonctions sémantiques <Typ> Tableau <Lc> Cste F 1 F 2 (<Lc>) [De~<Structsimple> | Types~ ] {, Cste F 3 F 4 }* F 1 Faire Type=‘V‘; Type_element=‘E’ (par défaut’) F 2 Faire Type= Type +Cste; Ranger Cste dans TABCOMP(soit Pt. Comp l’emplacement); Compte: =1 F 3 Faire Type= Type + ‘, ’+Cste; Ranger Cste dans TABCOMP; Compte= Compte +1; F 4 Soit T est le type produit par <Structsimple> ou Types. Type_element = T; Faire Type= Type + Type_element < Tableau >
Sémantique d’une déclaration : Fonctions sémantiques <S> <Li> [ Sep <Typ> ] F 1 Déjà traité en CS 7. C’est plus général Soit L la liste produite par <Li> et soit Type le type produit par <Typ>. F 1 Ranger Type dans TABTYP si Type n’existe pas. Soit I son indice dans cette table. Pour chaque Idf dans L : -- Le mettre dans la table des symboles; -- Lui attribuer une adresse relative A et le mettre dans la table des objets (soit Pt son emplacement). L’objet créé aura comme Statut=‘L’; Type=I; Nombre=Longueur(Type) et Adresse=A; Si type simple : Générer le quadruplé (‘D’+types, Pt, , ) Si structure simple : Générer le quadruplé (‘DS’, Pt, , ) Si tableau : Générer le quadruplé (‘DT’, Ptcomp, Compte, ) <S>
Sémantique de Aff_struct : Fonctions sémantiques Aff_struct (Idf F 1, Cste F 2 , <Exp>) F 3 F 1 Vérifier que idf est déclarée comme une structure (S). Sinon Erreur. Soit Pt son emplacement dans TABOB F 2 Récupérer le nombre (N)de champ de S. Si cste <1 ou cste >N : Erreur. Récupérer le type (T) du champ de S de rang cste. F 3 Soit Temp le résultat de <Exp>. Vérifier si le type de Temp est égal à T. Si non égal : erreur. Générer le quadruplet ( ‘Aff_struct’, Pt, cste, Temp) < Aff_struct>
Sémantique de Aff_element : Fonctions sémantiques Aff_element (<Exp> ) F 1 [[ <Exp> F 2 {, <Exp> F 3 }* ]] , F 4 F 1 Soit Temp 1 (emplacement dans TABOB)le résultat de <Exp> et soit Type son type. Si Type n’est pas un tableau : Erreur. Récupérer dans Typtab son type et dans Dim sa dimension F 2 Soit Temp le résultat de <Exp>. Si son type n’est pas un entier: Erreur. Intialiser Compte à 0. Mettre Temp dans la table Tabcomp. Soit Ptabcomp son emplacement. F 3 Soit Temp le résultat de <Exp>. Si son type n’est pas un entier: Erreur. Incrémenter Compte d’une unité. Mettre Temp dans la table Tabcomp. < Aff_element>
Sémantique de Aff_element : Fonctions sémantiques Aff_element (<Exp> ) F 4 F 1 [[ <Exp> F 2 {, <Exp> F 3 }* ]] , F 4 Soit Temp 2 (emplacement dans TABOB)le résultat de <Exp> et soit Type 2 son type. Si Type 2 # Typtab : Erreur. Si Compte # Dim : Erreur Générer le quadruplé (‘Aff_element’, Temp 1, Ptabcomp, Temp 2) < Aff_element>
Sémantique de Struct : Fonctions sémantiques Struct ( <Exp> F 1 , Cste ) F 2 F 1 Soit Temp 1 (emplacement dans TABOB)le résultat de <Exp> et soit Type 2 son type. Si Type 2 n’est pas une structure : Erreur. Récupérer le nombre de champ de la structure dans N et le type du champ n° cste (Typechamp) F 2 Vérifier que Cste est entière et comprise entre 1 et N. Sinon Erreur. Générer un temporaire d’adresse avec le ‘Satut=‘Y’et avec Type= Typechamp. Soit Temp 2 son emplacement dans TABOB). Générer le quadruplé (‘Struct’, Temp 1, Cste, Temp 2) < Struct>
Sémantique de Element : Fonctions sémantiques Element ( <Fonct> F 1 [[ <Exp> F 2 {, <Exp> F 3 }* ]] ) F 4 F 1 Soit Temp 1 (emplacement dans TABOB)le résultat de <Fonct> et soit Type 2 son type. Si Type 2 n’est pas une tableau : Erreur. Récupérer la dimension du tableau dans Dim et le type des éléments dans Typtab F 2 Soit Temp 1 le résultat de <Exp>. Vérifier que Temp est du type entier. Sinon Erreur. Intialiser Compte à 0. Mettre Temp 1 dans la table Tabcomp. Soit Ptabcomp son emplacement F 3 Soit Temp le résultat de <Exp>. Si son type n’est pas un entier: Erreur. Incrémenter Compte d’une unité. Mettre Temp dans la table Tabcomp. < Element>
Sémantique de Element : Fonctions sémantiques Element ( <Fonct> F 1 [[ <Exp> F 2 {, <Exp> F 3 }* ]] ) Si Dim # Compte : Erreur F 4 Générer un temporaire d’adresse avec le ‘Satut=‘Y’et avec Type= Typtab. Soit Temp 2 son emplacement dans TABOB). Générer le quadruplé (‘Element’, Temp 1, Ptabcomp, Temp 2) < Element> F 4
Sémantique de Init_Struct et Init_vecteur : Fonctions sémantiques Retrouver la sémantique pour Init_struct et Init_vecteur
Sémantique des structures : Exemple soit s une structure(entier, chaine, booleen); debut aff_struct(s, 1, 5); aff_struct(s, 2, 'abc'); aff_struct(s, 3, Vrai); ecrire (Struct(s, 2)); TABTYP TABCOMP ‘Ds’ 1 0 ‘L’ 1 5 0 1 ‘Aff_st’ 1 1 2 1 ‘C’ 2 1 0 2 ‘Aff_st’ 1 3 4 2 ‘C’ 2 1 1 3 ‘Aff_st’ 1 5 6 3 ‘C’ 2 1 2 4 ‘Struct’ 1 3 7 4 ‘C’ 3 1 3 5 ‘Ecr’ 0 1 5 ‘C’ 2 1 4 6 ‘C’ 4 1 5 7 ‘Y’ 3 1 1 Quadruplés générés fin LONGZDD 0 TABOB 2 (ESB) 7 TABCONS ‘ 1’, ‘ 5’, ’ 2’, ’abc’, ’ 3’, ’vrai’ 0 1 2 3 4 5 En fin de compilation, programme source = table des quadruplés + TABOB + TABCONS + LONGZDD
Sémantique des vecteurs : Exemple soit T un vecteur(3) de entier; debut Aff_element(T[1], 13); Aff_element(T[2], 18); Aff_element(T[3], 35); ecrire( Element(T[2]) ); fin 0 ‘Dt’ 2 0 ‘C’ 1 1 0 1 ‘Aff_el’ 2 1 ‘L’ 2 3 0 2 ‘Aff_el’ 2 3 4 2 ‘C’ 1 1 1 3 ‘Aff_el’ 2 5 6 3 ‘C’ 1 1 2 4 ‘Elem’ 2 4 7 4 ‘C’ 1 1 3 5 ‘Ecr’ 5 1 5 ‘C’ 1 1 4 6 ‘C’ 1 1 5 7 ‘Y’ 1 1 1 Quadruplés générés LONGZDD TABOB 8 TABTYP EV 3 E TABCOMP 1 3 5 1 5 8 0 1 2 3 4 5 TABCONS ‘ 3’, ‘ 1’, ’ 13’, ’ 2’, ’ 18’, ’ 35’ 0 1 2 3 4 5 En fin de compilation, programme source = table des quadruplés + TABOB + TABCONS + LONGZDD
Structures simples et tableaux : interprétation À la rencontre du quadruplé (‘Dt’, Pt, Liste , Dim ) Pt : Pointeur dans TABOB vers l’objet tableau Liste : Pointeur dans TABCOMP vers la liste des bornes Dim : Dimension (nombre de bornes) Il y a : Allocation d’une zone pour le descriptif et son remplissage Allocation d’un espace pour le tableau et initialisation à Nil
Structures simples et tableaux : interprétation À la rencontre du quadruplé (‘Ds’, Pt, , ) Pt : pointeur dans TABOB vers la structure Il y a Allocation d’un espace pour la structure dont la taille est égal au nombre de champ Allocation pour les différents champs en fonction des types
Structures simples et tableaux : interprétation À la rencontre du quadruplé (‘Element’, Ptobj, Ptcomp , Ptres ) Ptobj: pointeur dans TABOB vers le tableau Ptcom : pointeur dans TABCOMP Ptres : pointeur vers l’objet où sera rangé le résultat Les opérations suivantes sont entreprises : - Accès au descriptif via le champ adresse de Ptobj. On y trouvera l’adresse du premier élément du tableau. - Utiliser le module de calcul d’adresse pour calculer l’emplacement de l ’élément d’indice i 1, i 2, i 3, . . - Vérifier que c’est dans l’intervalle. Sinon Erreur. (Ces indices sont récupérés via TABCOMP TABOB adresses) - Récupérer le résultat dans Ptres
Structures simples et tableaux : interprétation Retrouver l’interprétation des quadruplés pour Struct, Aff_struct, Aff_element, Init_struct et Init_vecteur
- Slides: 36