From 0e835d9b8f97087810dddb9743aa84b6431ff3a7 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 27 Jul 2019 12:55:31 -0400 Subject: Rename hash.* -> scope.* --- scope.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 scope.c (limited to 'scope.c') diff --git a/scope.c b/scope.c new file mode 100644 index 0000000..32167fc --- /dev/null +++ b/scope.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include + +#include "node.h" +#include "scope.h" + +scope* mkscope(prev) +scope* prev; +{ + int i; + + scope *p = malloc(sizeof(scope)); + assert(p); + + for (i = 0; i < HASH_SIZE; i++) + p->table[i] = NULL; + + p->next = next; + p->function_boundry = 0; + + return p; +} + +void free_scope(s) +scope *s; +{ + int i; + + if (!s) + return; + + for (i = 0; i < HASH_SIZE; i++) { + free_nodes(s->table[i]); + } + + free(s); +} + +/*Copied from Compilers, Aho*/ +#define EOS '\0' +int hashpjw(s) +char* s; +{ + char *p; + unsigned h = 0, g; + + for (p = s; *p != EOS; p++) { + h = (h<<4) + *p; + if (g = h & 0xf0000000) { + h^= g>>24; + h^= g; + } + } + + return h % HASH_SIZE; +} + +scope* push_scope(root); +scope* root; +{ + scope *p = mkscope(); + p->next = root; + return p; +} + +scope* pop_scope(root); +scope *root; +{ + scope *p; + + if (!root) + return NULL; + + p = root->next; + + free_scope(root); + return p; +} + +node* scope_insert(s, name) +scope *s; +char *name; +{ + int hash = hashpwj(name); + + node *tmp = root->table[hash]; + return root->table[hash] = list_insert(tmp, name); +} + +node* scope_search(root, name) +scope *root; +char *name; +{ + int hash = hashpwj(name); + + node *tmp = root->table[hash]; + return list_search(tmp, name); +} + +node* scope_search_all(root, name) +scope *root; +char *name; +{ + scope *p; + node *tmp; + + for (p = root; p; p = p->next) + if (tmp = scope_search(p, name)) + return tmp; + + return NULL; +} + +node* scope_safe_search(root, name) +scope *root; +char *name; +{ + scope *p; + node *tmp; + + for (p = root; p; p = p->next) { + if (tmp = scope_search(p, name)) + return tmp; + if (p->f) + return NULL + } + + return NULL; +} + +void print_scope(s) +scope *s; +{ + int i; + node_t * tmp; + for (i = 0; i < HASH_SIZE; i++) { + for( tmp=s->table[i]; tmp; tmp = tmp->next) { + fprintf(stderr, "\t%s\n", tmp->name); + } + } +} -- cgit v1.1 From d9ba5ec2f86dd69eae4edac586a889fccd8d31b1 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 27 Jul 2019 13:26:15 -0400 Subject: Fix typos & errors --- scope.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'scope.c') diff --git a/scope.c b/scope.c index 32167fc..d09f1b4 100644 --- a/scope.c +++ b/scope.c @@ -6,8 +6,7 @@ #include "node.h" #include "scope.h" -scope* mkscope(prev) -scope* prev; +scope* mkscope() { int i; @@ -17,7 +16,7 @@ scope* prev; for (i = 0; i < HASH_SIZE; i++) p->table[i] = NULL; - p->next = next; + p->next = NULL; p->function_boundry = 0; return p; @@ -32,7 +31,7 @@ scope *s; return; for (i = 0; i < HASH_SIZE; i++) { - free_nodes(s->table[i]); + free_list(s->table[i]); } free(s); @@ -57,15 +56,15 @@ char* s; return h % HASH_SIZE; } -scope* push_scope(root); -scope* root; +scope* push_scope(root) +scope *root; { scope *p = mkscope(); p->next = root; return p; } -scope* pop_scope(root); +scope* pop_scope(root) scope *root; { scope *p; @@ -79,11 +78,11 @@ scope *root; return p; } -node* scope_insert(s, name) -scope *s; +node* scope_insert(root, name) +scope *root; char *name; { - int hash = hashpwj(name); + int hash = hashpjw(name); node *tmp = root->table[hash]; return root->table[hash] = list_insert(tmp, name); @@ -93,7 +92,7 @@ node* scope_search(root, name) scope *root; char *name; { - int hash = hashpwj(name); + int hash = hashpjw(name); node *tmp = root->table[hash]; return list_search(tmp, name); @@ -123,8 +122,8 @@ char *name; for (p = root; p; p = p->next) { if (tmp = scope_search(p, name)) return tmp; - if (p->f) - return NULL + if (p->function_boundry) + return NULL; } return NULL; @@ -134,7 +133,7 @@ void print_scope(s) scope *s; { int i; - node_t * tmp; + node * tmp; for (i = 0; i < HASH_SIZE; i++) { for( tmp=s->table[i]; tmp; tmp = tmp->next) { fprintf(stderr, "\t%s\n", tmp->name); -- cgit v1.1 From 60507214c098beaf3ae01a202e564bfe2f7c8364 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 27 Jul 2019 21:08:22 -0400 Subject: Add basic scoping --- scope.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'scope.c') diff --git a/scope.c b/scope.c index d09f1b4..379be97 100644 --- a/scope.c +++ b/scope.c @@ -56,26 +56,29 @@ char* s; return h % HASH_SIZE; } -scope* push_scope(root) -scope *root; +void push_scope(root) +scope **root; { - scope *p = mkscope(); - p->next = root; - return p; + scope *tmp = mkscope(); + + assert(tmp); + + tmp->prev = *root; + *root = tmp; } -scope* pop_scope(root) -scope *root; +void pop_scope(root) +scope **root; { - scope *p; + scope *tmp; - if (!root) - return NULL; + if (!*root) + return; - p = root->next; + tmp = *root; + *root = (*root)->prev; - free_scope(root); - return p; + free_scope(tmp); } node* scope_insert(root, name) @@ -105,7 +108,7 @@ char *name; scope *p; node *tmp; - for (p = root; p; p = p->next) + for (p = root; p; p = p->prev) if (tmp = scope_search(p, name)) return tmp; @@ -119,10 +122,10 @@ char *name; scope *p; node *tmp; - for (p = root; p; p = p->next) { + for (p = root; p; p = p->prev) { if (tmp = scope_search(p, name)) return tmp; - if (p->function_boundry) + if (p->ret_var) return NULL; } -- cgit v1.1 From f4d98d609e09ae172dbcccff742cc654d8b51a52 Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 27 Jul 2019 21:09:10 -0400 Subject: Add initial scope checking --- scope.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'scope.c') diff --git a/scope.c b/scope.c index 379be97..11a9c5b 100644 --- a/scope.c +++ b/scope.c @@ -16,8 +16,8 @@ scope* mkscope() for (i = 0; i < HASH_SIZE; i++) p->table[i] = NULL; - p->next = NULL; - p->function_boundry = 0; + p->prev = NULL; + p->ret_var= NULL; return p; } -- cgit v1.1 From 8cd6be853b61798a5fd4114292c62bb9384497bc Mon Sep 17 00:00:00 2001 From: Tucker Evans Date: Sat, 3 Aug 2019 17:45:09 -0400 Subject: Fix double free error --- scope.c | 1 + 1 file changed, 1 insertion(+) (limited to 'scope.c') diff --git a/scope.c b/scope.c index 11a9c5b..6706765 100644 --- a/scope.c +++ b/scope.c @@ -35,6 +35,7 @@ scope *s; } free(s); + s = NULL; } /*Copied from Compilers, Aho*/ -- cgit v1.1