No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

table_symboles.c 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "table_symboles.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. void initialise_table(Table_Symboles * table){
  5. table->indexAvailableBottom = TABLE_SIZE - 1;
  6. table->indexAvailableTop = 0;
  7. table->depth = 0;
  8. }
  9. int variable_exists(Table_Symboles * table, char * varName){
  10. for (int i = 0; i < table->indexAvailableTop; i++){
  11. if (strcmp(varName, table->array[i].Variable_Name) == 0){
  12. return i;
  13. }
  14. }
  15. for (int i = (table->indexAvailableBottom + 1); i < TABLE_SIZE; i++){
  16. if (strcmp(varName, table->array[i].Variable_Name) == 0){
  17. return i;
  18. }
  19. }
  20. return 0;
  21. }
  22. int add_symbole_top(Table_Symboles * table, char * varName, enum Symbole_Type type, enum Initialised_Variable init, int depth){
  23. Symbole symbole;
  24. strcpy(symbole.Variable_Name, varName);
  25. symbole.addr = table->indexAvailableTop;
  26. symbole.init = init;
  27. symbole.type = type;
  28. symbole.symbole_depth = table->depth;
  29. if (table->indexAvailableTop >= table->indexAvailableBottom){
  30. return -1;
  31. } else if (variable_exists(table, varName) != 0){
  32. return -2;
  33. } else {
  34. table->array[table->indexAvailableTop] = symbole;
  35. table->indexAvailableTop++;
  36. }
  37. return 0;
  38. }
  39. int add_symbole_bottom(Table_Symboles * table, char * varName, enum Symbole_Type type, enum Initialised_Variable init){
  40. Symbole symbole;
  41. strcpy(symbole.Variable_Name, varName);
  42. symbole.addr = table->indexAvailableBottom;
  43. symbole.init = init;
  44. symbole.type = type;
  45. //symbole.symbole_depth = -1;
  46. if (table->indexAvailableTop >= table->indexAvailableBottom){
  47. return -1;
  48. } else if (variable_exists(table, varName) != 0){
  49. return -2;
  50. } else {
  51. table->array[table->indexAvailableBottom] = symbole;
  52. table->indexAvailableBottom--;
  53. }
  54. return 0;
  55. }
  56. int remove_symboles(Table_Symboles * table, int depth){
  57. int index;
  58. if (depth < table->depth){
  59. return -1;
  60. } else {
  61. index = table->indexAvailableTop;
  62. while(table->array[index].symbole_depth == depth && index >=0){
  63. //remove
  64. table->indexAvailableTop--;
  65. index--;
  66. }
  67. //TODO: vérifier qu'il n'y a pas de varaibles temporarires au moment de changement de profondeur
  68. }
  69. return 0;
  70. }
  71. int initialise_symbole(Table_Symboles * table, char * varName){
  72. int index = variable_exists(table, varName);
  73. if (index == -1){
  74. return -1;
  75. } else {
  76. table->array[index].init = INITIALISED;
  77. }
  78. }
  79. void print_symbole(Symbole * symbole){
  80. char * var = symbole->Variable_Name;
  81. int addr = symbole->addr;
  82. enum Symbole_Type type = symbole->type;
  83. char typeStr[20];
  84. if (type == TYPE_INT){
  85. strcpy(typeStr, "INT");
  86. } else{
  87. strcpy(typeStr, "CONST_INT");
  88. }
  89. enum Initialised_Variable init = symbole->init;
  90. char initStr[20];
  91. if (init == INITIALISED){
  92. strcpy(initStr,"INITIALISED");
  93. } else{
  94. strcpy(initStr,"NOT_INITIALISED");
  95. }
  96. int depth = symbole->symbole_depth;
  97. printf("%-20s\t\t %-12s\t\t %-12d\t %-20s\t %-12d\n", var, typeStr, addr, initStr, depth);
  98. }
  99. void print_table(Table_Symboles * table){
  100. printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\t %-12s\n", "Variable Name", "Type", "Address", "Initialised", "Depth");
  101. int indexTop = table->indexAvailableTop;
  102. int indexBottom = table->indexAvailableBottom;
  103. Symbole symbole;
  104. for (int i = 0; i < indexTop; i++){
  105. symbole = table->array[i];
  106. print_symbole(&symbole);
  107. }
  108. if (table->indexAvailableBottom != TABLE_SIZE - 1){
  109. printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\t %-12s\n", "...", "...", "...", "...", "...");
  110. for (int i = (indexBottom + 1); i < TABLE_SIZE; i++){
  111. symbole = table->array[i];
  112. print_symbole(&symbole);
  113. }
  114. }
  115. }