diff --git a/table.c b/table.c index 43980ff..e6f09f0 100644 --- a/table.c +++ b/table.c @@ -1,12 +1,113 @@ -#include +#include #include +#include /*At the start of the execution : the whole array is empty*/ -symbolTable = malloc(sizeof(symbol) * START_TABLE_SIZE) +symbolTable = malloc(sizeof(symbol) * START_TABLE_SIZE); + currentIndex = 0; maxIndex = START_TABLE_SIZE; +currentDepth = 0; + +/* Error display */ +void error(char* mess){ + printf("ERROR : %s\n", &mess); + exit(-1); +} + +/* Returns the offset from EBP to the symbol in the stack */ +int getOffset(char* name){ + return (ebp + getStruct(name).offset); +} + +/* Returns the structure with this name */ +Symbol getStruct(char* name){ + for(int i=0; i < currentIndex; i++){ + if (symbolTable[i].name == name){ + return symbolTable[i]; + } + } + error("No structure found"); +} + +/* Returns the index with this name*/ +int getIndex(char* name){ + for(int i=0; i < currentIndex; i++){ + if (strcmp(symbolTable[i].name, &name) == 0){ + return i; + } + } + error("No index found"); +} + +/* removes all symbols associated with the current Depth*/ +void clearOutOfScopeVariable(){ + for(int i=0; i < currentIndex; i++){ + if (symbolTable[i].depth == currentDepth){ + suppressElement(symbolTable[i]); + } + } + error("No index found"); +} + + +/* Toggles the init state of the symbol */ +void toggleInit(char *name){ + symbolTable[getIndex(&symbolTable, currentIndex, &name)].init = true; +} + +/* Adds an element */ +void addElement(Symbol element){ + + //checks for overflow + checkArraySanity(); + + if (currentIndex == 0){ + symbolTable[0] = element; + } else { + symbolTable[currentIndex].name = element.name; + symbolTable[currentIndex].init = element.init; + symbolTable[currentIndex].varType = element.varType; + symbolTable[currentIndex].offset = initOffset(currentIndex -1); // TODO replace with ESP + symbolTable[currentIndex].depth = element.depth; + } + + //TODO add ESP increment + + currentIndex ++; +} + + +// TODO replace with ESP +/* Calcule l'offset à partir de l'offset de l'élément précédent */ +int initOffset(int index){ + switch (symbolTable[index].varType){ + case INT: + return (symbolTable[index].offset + 1); + break; + case FLOAT: + return (symbolTable[index].offset + 1); + break; + default: + error("Impossible to compute the new offset"); + } +} + + +/* Removes an element */ +void suppressElement(Symbol element){ + for(int i = getIndex(element.name); i < (currentIndex - 1); i ++){ + symbolTable[i] = symbolTable[i+1]; + } + currentIndex --; + + // checks if there is a need to reduce the size of the array + checkArraySanity(); +} + + /*Checks for the length of the array and reallocates if necessary*/ void checkArraySanity(){ if (currentIndex == maxIndex){ @@ -18,90 +119,7 @@ void checkArraySanity(){ } } -/* -Suppress variable dont la profondeur est plus grande -add element */ - -/* a avoir -tableau, length, esp, indexTab */ - -/* Fonction d'affichage des erreurs */ -void error(char * mess){ - printf("ERROR : %s\n", &mess); - exit(-1); -} - - -/* Récupérer l'addresse à partir du nom */ -int getOffset(int esp, char* name, Symbol *tab, int endingIndex){ - return (esp + getStruct(&tab, endingIndex, &name).offset); -} - -/* Récupérer la structure d'un élement à partir du nom */ -Symbol getStruct(Symbol* tab, int endingIndex, char* name){ - for(int i=0; i < endingIndex; i++){ - if (tab[i].name == name){ - return tab[i]; - } - } - error("No structure found"); -} - -/* Récupérer l'index d'une valeur dans le tableau*/ -int getIndex(Symbol* tab, int endingIndex, char* name){ - for(int i=0; i < endingIndex; i++){ - if (strcmp(tab[i].name, &name) == 0){ - return i; - } - } - error("No index found"); -} - - -/* Toggle le init */ -void toggleInit(char *name, Symbol *tab, int endingIndex){ - tab[getIndex(&tab, endingIndex, &name)].init = true; -} - -/* Ajoute un élément */ -void addElement(Symbol *tab, int endingIndex, Symbol element){ - if (endingIndex == 0){ - tab[0] = element; - } - else { - tab[endingIndex].name = element.name; - tab[endingIndex].init = element.init; - tab[endingIndex].varType = element.varType; - tab[endingIndex].offset = initOffset(&tab, endingIndex -1); - tab[endingIndex].deep = element.deep; - } - endingIndex ++; // faudra la mettre en variable globale -} - -/* Calcule l'offset à partir de l'offset de l'élément précédent */ -int initOffset(Symbol *tab, int index){ - int offset = 0; - switch (tab[index].varType){ - case INT: - return (tab[index].offset + 1); - break; - case FLOAT: - return (tab[index].offset + 1); - break; - default: - error("Impossible to compute the nexw offset"); - } -} - - -/* Supprimer un élément de la table des symboles */ -suppressElement(Symbol *tab, int endingIndex, Symbol element){ - for(int i = getIndex(&tab, endingIndex, element.name); i < (endingIndex - 1); i ++){ - tab[i] = tab[i+1]; - } - endingIndex --; // variable globale -} - +/*reallocates the array with the specified size*/ void reallocateArray(int size){ Symbol* newSymbolTable = malloc(sizeof (symbol) * size); // we double the size of the array Symbol* oldSymbolTable = symbolTable; // we double the size of the array diff --git a/table.h b/table.h index 6999196..de3045c 100644 --- a/table.h +++ b/table.h @@ -9,19 +9,35 @@ enum enumVarType {INT, FLOAT}; // a adapter #define START_TABLE_SIZE 128; /*indexes in the array*/ -static int currentIndex; +static int currentIndex; // the next to index to be used static int maxIndex; static symbol* symbolTable; +// stack pointers +static int esp; +static int ebp; + +static int currentDepth; + typedef struct { char* name; bool init; enumVarType varType; int offset; - int deep; + int depth; } Symbol; +// TODO : move comments here + void reallocateArray(int size); void checkArraySanity(); +void suppressElement(Symbol element); +int initOffset(int index); +void addElement(Symbol element); +void toggleInit(char *name); +int getIndex(char* name); +Symbol getStruct(char* name); +void error(char* mess); +int getOffset(char* name); #endif