123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #include "table_symboles.h"
- #include <stdio.h>
- #include <string.h>
-
-
- void initialise_table(Table_Symboles * table){
- table->indexAvailableBottom = TABLE_SIZE - 1;
- table->indexAvailableTop = 0;
- table->depth = 0;
- }
-
- int variable_exists(Table_Symboles * table, char * varName){
- for (int i = 0; i < table->indexAvailableTop; i++){
- if (strcmp(varName, table->array[i].Variable_Name) == 0){
- return i;
- }
- }
-
- for (int i = (table->indexAvailableBottom + 1); i < TABLE_SIZE; i++){
- if (strcmp(varName, table->array[i].Variable_Name) == 0){
- return i;
- }
- }
- return 0;
- }
- int add_symbole_top(Table_Symboles * table, char * varName, enum Symbole_Type type, enum Initialised_Variable init, int depth){
- Symbole symbole;
- strcpy(symbole.Variable_Name, varName);
- symbole.addr = table->indexAvailableTop;
- symbole.init = init;
- symbole.type = type;
- symbole.symbole_depth = table->depth;
- if (table->indexAvailableTop >= table->indexAvailableBottom){
- return -1;
- } else if (variable_exists(table, varName) != 0){
- return -2;
- } else {
- table->array[table->indexAvailableTop] = symbole;
- table->indexAvailableTop++;
- }
- return 0;
- }
-
- int add_symbole_bottom(Table_Symboles * table){
- Symbole symbole;
- symbole.addr = table->indexAvailableBottom;
- //symbole.symbole_depth = -1;
- if (table->indexAvailableTop >= table->indexAvailableBottom){
- return -1;
- } else {
- table->array[table->indexAvailableBottom] = symbole;
- table->indexAvailableBottom--;
- }
- return 0;
- }
-
- int remove_symboles(Table_Symboles * table, int depth){
- int index;
- if (depth < table->depth){
- return -1;
- } else {
- index = table->indexAvailableTop;
- while(table->array[index].symbole_depth == depth && index >=0){
- //remove
- table->indexAvailableTop--;
- index--;
- }
-
- //TODO: vérifier qu'il n'y a pas de varaibles temporarires au moment de changement de profondeur
- }
- return 0;
- }
-
- void free_temp(Table_Symboles * table){
- table->indexAvailableBottom++;
- }
-
- int initialise_symbole(Table_Symboles * table, char * varName){
- int index = variable_exists(table, varName);
- if (index == -1){
- return -1;
- } else {
- table->array[index].init = INITIALISED;
- }
- }
-
- void print_symbole(Symbole * symbole){
- char * var = symbole->Variable_Name;
- int addr = symbole->addr;
- enum Symbole_Type type = symbole->type;
- char typeStr[20];
- if (type == TYPE_INT){
- strcpy(typeStr, "INT");
- } else{
- strcpy(typeStr, "CONST_INT");
- }
- enum Initialised_Variable init = symbole->init;
- char initStr[20];
- if (init == INITIALISED){
- strcpy(initStr,"INITIALISED");
- } else{
- strcpy(initStr,"NOT_INITIALISED");
- }
- int depth = symbole->symbole_depth;
- printf("%-20s\t\t %-12s\t\t %-12d\t %-20s\t %-12d\n", var, typeStr, addr, initStr, depth);
- }
-
- void print_table(Table_Symboles * table){
- printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\t %-12s\n", "Variable Name", "Type", "Address", "Initialised", "Depth");
- int indexTop = table->indexAvailableTop;
- int indexBottom = table->indexAvailableBottom;
- Symbole symbole;
- for (int i = 0; i < indexTop; i++){
- symbole = table->array[i];
- print_symbole(&symbole);
- }
- if (table->indexAvailableBottom != TABLE_SIZE - 1){
- printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\t %-12s\n", "...", "...", "...", "...", "...");
- for (int i = (indexBottom + 1); i < TABLE_SIZE; i++){
- symbole = table->array[i];
- print_symbole(&symbole);
- }
- }
-
-
-
- }
|