symtab.c
上传用户:wqdrylgs
上传日期:2007-02-09
资源大小:65k
文件大小:7k
源码类别:

汇编语言

开发平台:

WINDOWS

  1. /****************************************************/
  2. /* File: symtab.c                                   */
  3. /* Symbol table implementation */
  4. /* for the C_Minus compiler */
  5. /****************************************************/
  6. #include <stdio.h>
  7. #include "globals.h"
  8. #include "util.h"
  9. #include "symtab.h"
  10. Symtab * GlobalTable; //global symble table for variables
  11. Symtab * pTable;
  12. FunEntry * FunTable[SIZE]; //symble table for functions
  13. /* the hash function */
  14. static int hash(char * key)
  15. {
  16. int temp = 0;
  17. int i;
  18. for (i = 0; key[i] != ''; i++)
  19. temp = ((temp << SHIFT) + key[i]) % SIZE;
  20. return temp;
  21. }
  22. /* create a new variable table
  23.  * and link it to its parent
  24.  */
  25. Symtab * Createtab(Symtab * pTable, FunEntry *pEntry)
  26. {
  27. Symtab * newtab = (Symtab *)malloc(sizeof(Symtab));
  28. if (newtab == NULL)
  29. return NULL; //out of memory
  30.   newtab->parent = pTable;
  31. newtab->nestlevel = (pTable == NULL)? 0 : pTable->nestlevel+1;
  32. newtab->memloc = 0;
  33. memset(newtab->valTable, 0, SIZE * sizeof(ValEntry *));
  34. newtab->funEntry = pEntry;
  35. return newtab;
  36. }
  37. /* insert a new entry to the variable table */
  38. ValEntry * Insert_Var(Symtab * pTable, char * name, Type type, int count)
  39. {
  40. int hashnumber = hash(name), size;
  41. ValEntry * pnew = (ValEntry *)malloc(sizeof(ValEntry));
  42. switch(type) {
  43. case Integer: size = sizeofint; break;
  44. case Float: size = sizeoffloat; break;
  45. case Char: size = sizeofchar; break;
  46. default: size = sizeofint;
  47. }
  48. pTable->memloc += size * count;
  49. pnew->name = copyString(name);
  50. pnew->type = type;
  51. pnew->offset = -pTable->memloc;
  52. pnew->next = pTable->valTable[hashnumber];
  53. pTable->valTable[hashnumber] = pnew;
  54. return pnew;
  55. }
  56. /* lookup a variable in the symbol table */
  57. int Lookup_Var(Symtab * pTable, FunEntry * pFun, char * name, ValEntry * pEntry)
  58. {
  59. int hashnumber = hash(name);
  60. ValEntry * ptemp;
  61. for ( ; pTable != NULL; pTable = pTable->parent) {
  62. for (ptemp = pTable->valTable[hashnumber]; ptemp != NULL; ptemp = ptemp->next)
  63. if (strcmp(ptemp->name, name) == 0) {
  64. pEntry->name = copyString(ptemp->name);
  65. pEntry->type = ptemp->type;
  66. pEntry->offset = ptemp->offset;
  67. pEntry->next = NULL;
  68. return pTable->nestlevel;
  69. }
  70. }
  71. if (pFun != NULL) {
  72. for (ptemp = pFun->para; ptemp != NULL; ptemp = ptemp->next)
  73. if (strcmp(name, ptemp->name) == 0) {
  74. pEntry->name = copyString(ptemp->name);
  75. pEntry->type = ptemp->type;
  76. pEntry->offset = ptemp->offset;
  77. pEntry->next = NULL;
  78. return 1;
  79. }
  80. }
  81. return -1;
  82. }
  83. /* insert a new entry to the function table */
  84. FunEntry * Insert_Fun(char * name, Type type, TreeNode * pTreeNode)
  85. {
  86. int hashnumber = hash(name), size = 14;
  87. FunEntry * pnew = (FunEntry *)malloc(sizeof(FunEntry));
  88. ValEntry * para;
  89. TreeNode * ptemp;
  90. pnew->name = copyString(name);
  91. pnew->type = type;
  92. pnew->para = NULL;
  93. if (strcmp(name, "main") == 0)
  94. size += 4;
  95. if (pTreeNode != NULL) {
  96. pnew->para = (ValEntry *)malloc(sizeof(ValEntry));
  97. pnew->para->name = copyString(pTreeNode->attr.name);
  98. pnew->para->type = pTreeNode->type;
  99. pnew->para->offset = size;
  100. if (pTreeNode->child[0] == NULL)
  101. switch (pnew->para->type) {
  102. case Integer: size += sizeofint; break;
  103. case Float: size += sizeoffloat; break;
  104. case Char: size += sizeofchar; break;
  105. default: size += sizeofint;
  106. }
  107. else
  108. size += sizeofint;
  109. for (ptemp = pTreeNode->sibling, para = pnew->para;
  110. ptemp != NULL; ptemp = ptemp->sibling, para = para->next) {
  111. para->next = (ValEntry *)malloc(sizeof(ValEntry));
  112. para->next->name = copyString(ptemp->attr.name);
  113. para->next->type = ptemp->type;
  114. para->next->offset = size;
  115. if (ptemp->child[0] == NULL)
  116. switch (para->next->type) {
  117. case Integer: size += sizeofint; break;
  118. case Float: size += sizeoffloat; break;
  119. case Char: size += sizeofchar; break;
  120. default: size += sizeofint;
  121. }
  122. else
  123. size += sizeofint;
  124. }
  125. para->next = NULL;
  126. }
  127. pnew->ret_val = size;
  128. pnew->next = FunTable[hashnumber];
  129. FunTable[hashnumber] = pnew;
  130. return pnew;
  131. }
  132. /* lookup a function in the symbol table */
  133. FunEntry * Lookup_Fun(char * name)
  134. {
  135. int hashnumber = hash(name);
  136. FunEntry * pEntry;
  137. for (pEntry = FunTable[hashnumber]; pEntry != NULL; pEntry = pEntry->next)
  138. if (strcmp(pEntry->name, name) == 0)
  139. return pEntry;
  140. return NULL;
  141. }
  142. /* procedure printFunTab prints a formatted 
  143.  * listing of the function table contents 
  144.  * to the listing file
  145.  */
  146. void printFunTab(void)
  147. {
  148. int i;
  149. fprintf(listing, "nFunction table:n");
  150. fprintf(listing,"nFunction Name  Type    n");
  151. fprintf(listing,"-------------  ----    n");
  152. for (i=0; i<SIZE; ++i) {
  153. FunEntry * pEntry;
  154. for (pEntry = FunTable[i]; pEntry != NULL; pEntry = pEntry->next) {
  155. ValEntry * para;
  156. fprintf(listing, "%-14s ", pEntry->name);
  157. printType(pEntry->type);
  158. fprintf(listing, "nParametern");
  159. fprintf(listing, "---------n");
  160. for (para = pEntry->para ; para != NULL; para = para->next) {
  161. fprintf(listing, "%s ", para->name);
  162. printType(para->type);
  163. fprintf(listing, "  %-dn", para->offset);
  164. }
  165. }
  166. }
  167. }
  168. /* procedure printSymTab prints a formatted 
  169.  * listing of the symbol table contents 
  170.  * to the listing file
  171.  */
  172. void printSymTab(TreeNode * tree)
  173. static int Globalprinted = FALSE;
  174. Symtab * pTable;
  175. if (!Globalprinted) {
  176. int i;
  177. fprintf(listing, "nSymbol table:n");
  178. fprintf(listing, "nNestlevel: %dn", GlobalTable->nestlevel); 
  179. fprintf(listing,"Variable Name  Type && Offsetn");
  180. fprintf(listing,"-------------  --------------n");
  181. for (i=0; i<SIZE; ++i) {
  182. ValEntry * pEntry;
  183. for (pEntry = GlobalTable->valTable[i]; pEntry != NULL; pEntry = pEntry->next) {
  184. fprintf(listing, "%-14s ", pEntry->name);
  185. printType(pEntry->type);
  186. fprintf(listing, "  %-dn", pEntry->offset);
  187. }
  188. }
  189. Globalprinted = TRUE;
  190. }
  191. while (tree != NULL) {
  192. int i;
  193. if (tree ->nodekind == Dec && tree->kind.dec == CompK) {
  194. pTable = tree->attr.table;    
  195. fprintf(listing, "nNestlevel: %dn", pTable->nestlevel); 
  196. fprintf(listing,"Variable Name  Type && Offsetn");
  197. fprintf(listing,"-------------  --------------n");
  198. for (i=0; i<SIZE; ++i) {
  199. ValEntry * pEntry;
  200. for (pEntry = pTable->valTable[i]; pEntry != NULL; pEntry = pEntry->next) {
  201. fprintf(listing, "%-14s ", pEntry->name);
  202. printType(pEntry->type);
  203. fprintf(listing, "  %-dn", pEntry->offset);
  204. }
  205. }
  206. }
  207. for (i=0; i<MAXCHILDREN; i++)
  208. printSymTab(tree->child[i]);
  209. tree = tree->sibling;
  210. }
  211. }