diff --git a/compiler-scopes.c b/compiler-scopes.c index ff0fc07..f7606b4 100644 --- a/compiler-scopes.c +++ b/compiler-scopes.c @@ -274,53 +274,65 @@ OBJ* getbynamelist(SCOPE* s, STRINGLIST* names, char** retname) { // Scope adding void addclassvardec(SCOPE* s, CLASSVARDEC* v) { ensurenoduplicates(s, v->base->names, v->base->debug); - v->next = s->classvardecs; - s->classvardecs = v; + CLASSVARDEC* new = copy(v, sizeof(CLASSVARDEC)); + new->next = s->classvardecs; + s->classvardecs = new; } void addvardec(SCOPE* s, VARDEC* v) { ensurenoduplicates(s, v->names, v->debug); - v->next = s->vardecs; - s->vardecs = v; + VARDEC* new = copy(v, sizeof(VARDEC)); + new->next = s->vardecs; + s->vardecs = new; } void addsubdec(SCOPE* s, SUBDEC* sd) { ensurenoduplicate(s, sd->name, sd->debug); - sd->next = s->subroutines; - s->subroutines = sd; + SUBDEC* new = copy(sd, sizeof(SUBDEC)); + new->next = s->subroutines; + s->subroutines = new; } void addclass(SCOPE* s, CLASS* c) { ensurenoduplicate(s, c->name, c->debug); - c->next = s->classes; - s->classes = c; + CLASS* new = copy(c, sizeof(CLASS)); + new->next = s->classes; + s->classes = new; } // Group adding void addclassvardecs(SCOPE* s, CLASSVARDEC* vs) { + CLASSVARDEC* next; while(vs != NULL) { + next = vs->next; addclassvardec(s, vs); - vs = vs->next; + vs = next; } } void addvardecs(SCOPE* s, VARDEC* vs) { + VARDEC* next; while(vs != NULL) { + next = vs->next; addvardec(s, vs); - vs = vs->next; + vs = next; } } void addsubdecs(SCOPE* s, SUBDEC* ss) { + SUBDEC* next; while(ss != NULL) { + next = ss->next; addsubdec(s, ss); - ss = ss->next; + ss = next; } } void addclasses(SCOPE* s, CLASS* c) { + CLASS* next; while(c != NULL) { + next = c->next; addclass(s, c); - c = c->next; + c = next; } } diff --git a/compiler.c b/compiler.c index 5fda157..c63bd4c 100644 --- a/compiler.c +++ b/compiler.c @@ -127,7 +127,7 @@ LINEBLOCK* compilecallln(CLASS* c, SUBROUTCALL* call) { // temporary ignore list for OS functions char* ignoresubdecs[] = { - "printInt", "void" + "printInt", "void", "peek", "int" }; int ignorecount = sizeof(ignoresubdecs) / sizeof(char*); diff --git a/parser.c b/parser.c index 6fa026d..f338f7d 100644 --- a/parser.c +++ b/parser.c @@ -106,6 +106,7 @@ TERM* parsetermnullified(PARSER* p) { t->type = unaryopterm; next(p); t->expression = parseterm(p); + t->expression->next = NULL; } else if(!strcmp(p->current->token, "(")) { next(p); t->type = innerexpression; @@ -148,7 +149,7 @@ TERM* parseexpressionnullified(PARSER* p) { while(isop(p->current)) { current->op = p->current->token[0]; next(p); - nextt = parsetermnullified(p); + nextt = parseterm(p); current->next = nextt; current = nextt; } @@ -466,6 +467,7 @@ PARAMETER* parseparameters(PARSER* p) { PARAMETER* head = parseparameter(p); PARAMETER* current = head; while(!strcmp(p->current->token, ",")) { + next(p); current->next = parseparameter(p); current = current->next; } @@ -518,7 +520,7 @@ SUBDEC* parsesubroutdec(PARSER* p) { SUBDEC* parsesubroutdecs(PARSER* p) { SUBDEC* head = parsesubroutdec(p); - SUBDEC* current= head; + SUBDEC* current = head; SUBDEC* next; while(next = parsesubroutdec(p), next != NULL) { current->next = next; diff --git a/util.c b/util.c index 30f53fa..cbfc2dd 100644 --- a/util.c +++ b/util.c @@ -13,6 +13,12 @@ char* ezheapstr(char* str) { return heapstr(str, strlen(str)); } +void* copy(void* v, int sz) { + void* copy = malloc(sz); + memcpy(copy, v, sz); + return copy; +} + int countplaces(int n) { int places = 1; int divisor = 1; diff --git a/util.h b/util.h index d606c3c..61521c6 100644 --- a/util.h +++ b/util.h @@ -14,6 +14,7 @@ char* heapstr(char* str, int len); char* ezheapstr(char* str); int countplaces(int n); char* itoa(int i); +void* copy(void* v, int sz); void printstrlist(STRINGLIST* strlist, FILE* stream); void freestrlist(STRINGLIST* strlist);