123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /* TABLE DES SYMBOLE DU COMPILATEUR (PILE)
-
- -----------------------------------------------------
- | symbole | adresse | type | initialisé |
- -----------------------------------------------------
- | | | | |
- | | | | |
- | | | | |
- | i | 0x777756b8 | int | false |
- | size | 0x777756b8 | int | true |
- -----------------------------------------------------
-
- Types pour l'implémentation :
- - enum type_t : [int]
- - struct symbole : {
- char nom[30];
- uintptr_t adresse;
- enum type_t type;
- char initialized;
- }
-
- Opérations possible :
- - init -> pile * -> void
- - push -> symbole -> pile * -> void
- - pop -> pile * -> symbole
- - status -> nom -> pile -> char */
-
- #ifndef TAB_SYMB_H
- #define TAB_SYMB_H
-
- #include <stdint.h>
-
-
-
-
-
-
-
-
-
- /**************************************/
- /**************************************/
- /**** Gestion des types possibles ****/
- /**************************************/
- /**************************************/
-
- //Enumération des types de base reconnus
- enum base_type_t {UNKNOWN, INT};
- //Table enregistrant la taille de ces types de bases (indexée sur les types)
- extern int taille_types[];
- //Structure gérant les types
- struct type_t {
- //Champs enregsitrant le type de base
- enum base_type_t base;
- //Si la variable est un pointeur, on enregitre son niveau (nombre de *)
- int pointeur_level;
- //Si il s'agit d'un tableau, on enregistre sa taille (nombre de cases) (même si c'est une variable on met quand même un nb_blocs à)
- int nb_blocs;
- //Si c'est un tableau addressale directement, cette valeur est à 1. Si c'est un pointeur vers un tableau, valeur à 2.
- int isTab;
- };
-
- //REtourne la représentation d'un type en string
- char * type_to_string(struct type_t type);
- //Constante pour les entiers
- extern const struct type_t integer;
-
-
-
- /**************************************/
- /**************************************/
- /***** Gestion de la profondeur *****/
- /**************************************/
- /**************************************/
- //Incrémente la profondeur
- void inc_prof();
- //Récupère la profondeur
- int get_prof();
- //Détruit toutes les variables de la profondeur actuelle puis décrémente la profondeur
- void reset_prof();
- //Décrémente la profondeur sans reset les variables
- void decrement_prof();
-
-
-
- /**************************************/
- /**************************************/
- /*Table des symboles : fonctionnement */
- /**************************************/
- /**************************************/
-
- //Structure représentant un symbole
- struct symbole_t {
- //Son Nom
- char nom[30];
- //Son Adresse
- uintptr_t adresse;
- //Son type
- struct type_t type;
- //Est il initialisé
- int initialized;
- //Sa profondeur de création
- int profondeur;
- };
-
- //Fonction d'affichage d'un symbole
- void print_symbole(struct symbole_t symbole);
-
- //Fonction d'initialisation de la table, à appeler une fois
- void init(void);
-
-
-
-
-
-
- /**************************************/
- /**************************************/
- /** Table des symboles : primitives **/
- /**************************************/
- /**************************************/
-
- //Ajout d'un symbole a la table
- int push(char * nom, int isInit, struct type_t type);
- //Destruction et récupération du premier élément de la table
- struct symbole_t pop();
- //Destruction des n premiers elee=ments de la table des symboles
- void multiple_pop(int n);
- //Retourne la dernière adresse disponible
- int get_last_addr();
- //Renvoi un pointeur vers le symbole correspondant au nom de variable
- struct symbole_t * get_variable(char * nom);
- //Affiche la table des symboles
- void print();
-
-
- #endif
|