Compilateur/Tables/Symboles/table_symboles.h
2021-06-18 09:25:12 +02:00

106 lines
2.9 KiB
C

#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, ADDR};
//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 à 1)
int nb_blocs;
//Si c'est un tableau cette valeur est à 1, 0 sinon.
int isTab;
//Si c'est une constante
int isConst;
};
//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;
//Constante pour les pointeurs
extern const struct type_t pointer;
/**************************************/
/**************************************/
/***** 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 elements 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