diff --git a/src/symbol_table.c b/src/symbol_table.c index a693301..5eb94d2 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -10,6 +10,7 @@ char * typey = "type"; char * funy = "function"; TableNode* funprime; TableNode* arrayprim; +extern SymbolTable* cur; typedef enum { //First 4 below are primitive types that are all encapsulated in primitive type @@ -256,6 +257,11 @@ if(topDef == NULL){ return newEntry; } } + +char* getType(TableNode* tn) { return tn->theType->theName; } +char* getName(TableNode* tn) { return tn->theName; } +int getLine(SymbolTable* st) { return st->Line_Number; } +int getColumn(SymbolTable* st) { return st->Column_Number; } /* //we use false for type defs and true for functions for parameter of typeOf TableNode* Define(SymbolTable* table, bool typeOf, char* id) { @@ -368,6 +374,36 @@ SymbolTable* getAncestor(SymbolTable* table) { } } +bool typeCheck(char* firstID, char* secondID){ + + + TableNode* entry1 = look_up(cur,firstID); + TableNode* entry2 = look_up(cur,secondID); + if(entry1==NULL){ + printf("first type not defined\n"); + return false; + } + if(entry2==NULL){ + printf("second type not defined\n"); + return false; + } + if(table_lookup(getAncestor(cur),getType(look_up(cur,firstID))) == + table_lookup(getAncestor(cur),getType(look_up(cur,secondID)))){ + if(strcmp(getType(look_up(cur,firstID)),"array")==0){ + if(look_up(cur,firstID)->additionalinfo->ArrayAdInfo->numofdimensions == + look_up(cur,secondID)->additionalinfo->ArrayAdInfo->numofdimensions && + look_up(cur,firstID)->additionalinfo->ArrayAdInfo->typeofarray == + look_up(cur,secondID)->additionalinfo->ArrayAdInfo->typeofarray){ + return true;} + else{ + return false;} + } + return true; + } + return false; +} + + SymbolTable* getParent(SymbolTable* st) { return st->Parent_Scope; } ListOfTable* getChildren(SymbolTable* st) { return st->Children_Scope; } @@ -375,10 +411,6 @@ SymbolTable* getFirstChild(ListOfTable* lt) { return lt->table; } ListOfTable* getRestOfChildren(ListOfTable* lt) { return lt->next; } TableNode* getFirstEntry(SymbolTable* st) { return st->entries; } TableNode* getNextEntry(TableNode* tn) { return tn->next; } -char* getType(TableNode* tn) { return tn->theType->theName; } -char* getName(TableNode* tn) { return tn->theName; } -int getLine(SymbolTable* st) { return st->Line_Number; } -int getColumn(SymbolTable* st) { return st->Column_Number; } // uncomment the below main function along with the headers above for a simple // standalone test of table and entry creation