Usando o padrao Visitor de forma decente. Verificacao semantica meio pronta.
[toypasc.git] / symbol_table.c
blob4c98801276cb0809479a1f7f733f46dd0ac32fee
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include "symbol_table.h"
6 Symbol *
7 symbol_new(char const * name)
9 Symbol * symbol = (Symbol *) malloc (sizeof(Symbol));
10 symbol->type = NONE_TYPE;
11 value_set(&symbol->value, symbol->type, NULL);
12 symbol->decl_linenum = 0;
13 symbol->params = 0;
14 symbol->param_types = (int *) malloc (sizeof(int) * 10);
16 symbol->next = NULL;
18 if (name != NULL)
19 symbol->name = strdup(name);
20 else
21 symbol->name = NULL;
23 return symbol;
26 /* Insere um simbolo na tabela indicada.
27 * Caso o simbolo ja exista, a memoria do
28 * simbolo do parametro sera liberada.
29 * Returns: O simbolo passado como parametro,
30 * caso este ainda nao esteja na tabela,
31 * ou um ponteiro para o simbolo encontrado.
33 Symbol *
34 symbol_insert(Symbol *symtab, Symbol *symbol)
36 Symbol *sym;
38 if (symbol == NULL)
39 return NULL;
41 sym = symbol_lookup(symtab, symbol->name);
43 if (sym != NULL) {
44 free(symbol->name);
45 free(symbol);
46 return sym;
49 symbol->next = symtab->next;
50 symtab->next = symbol;
52 return symbol;
55 Symbol *
56 symbol_lookup(Symbol *symtab, char const *name)
58 Symbol *temp;
60 for (temp = symtab->next; temp != NULL; temp = temp->next) {
61 if (!strcmp (temp->name, name))
62 return temp;
65 return temp;
68 void
69 symbol_table_destroy(Symbol *symtab)
71 Symbol *first;
72 Symbol *to_kill;
73 first = symtab->next;
74 symtab->next = NULL;
76 while (first != NULL) {
77 to_kill = first;
78 first = first->next;
79 if (to_kill->name != NULL)
80 free(to_kill->name);
81 free(to_kill);
85 void
86 symbol_print(Symbol *symbol)
88 if (symbol == NULL) {
89 printf("NULL\n\n");
90 return;
93 printf("Symbol: %x\n", symbol);
94 printf("name: %s\n", symbol->name);
95 printf("type: %d\n", symbol->type);
96 printf("value:");
97 value_print(&symbol->value, symbol->type);
98 printf("\ndeclaration line: %d\n", symbol->decl_linenum);
99 printf("next: %x\n\n", symbol->next);
102 void
103 symbol_table_dump(Symbol *symtab)
105 Symbol *temp = symtab;
107 for (temp = symtab->next; temp != NULL; temp = temp->next)
108 symbol_print(temp);