From 1765878b85c9846e0b19134cdad9378fb6f1ace9 Mon Sep 17 00:00:00 2001 From: Annie Date: Thu, 3 Apr 2025 17:51:18 -0400 Subject: [PATCH 01/10] rebased made progress on type checking function definitions and calls --- src/grammar.y | 85 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index b3f2334..cbb9ec1 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -199,33 +199,45 @@ definition: } else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION) { printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); } else { + setStartLine(node, @1.first_line); + setAsKeyword(node, false); + } + cur = CreateScope(cur, 0, 0); + } L_PAREN ID { + printdebug("Currently see a function definition taking only one parameter (no as) of name %s and argument name %s", + $1,$4); + CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); + }R_PAREN ASSIGN sblock + | ID { + TableNode *node = table_lookup(getAncestor(cur), $1); + if (node == undefined) { + printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); + }else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION){ + printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); + } + else { + printdebug("setting as keyword to true"); setStartLine(node, @1.first_line); setAsKeyword(node, true); } cur = CreateScope(cur, 0, 0); - } - AS L_PAREN - { + }AS L_PAREN { TableNode *parameter = getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))); - printdebug("%s", getType(parameter)); + printdebug("parameter type: %s", getType(parameter)); if (parameter == undefined) { printdebug("function defined with as, but parameter is undefined at line %d, column %d", @1.first_line, @1.first_column); - } else if(getAdInfoType(parameter) != TYPE_RECORD) { + }else if(getAdInfoType(parameter) != TYPE_RECORD){ printdebug("record: %s., primitive: %s.", getType(parameter), getName(recprime)); printdebug("function defined with as, but parameter is type %s at line %d, column %d", getType(parameter),@1.first_line, @1.first_column); - } else { - for (TableNode* entry = getFirstEntry(getRecList(parameter)); entry!= NULL; entry = getNextEntry(entry)) { - CreateEntry(cur, entry, NULL, NULL); + }else { + for (TableNode* entry = getFirstEntry(getRecList(parameter)); entry!= NULL; entry = getNextEntry(entry)){ + printdebug("creating entry of type %s for function", getType(entry)); + CreateEntry(cur, entry, "undefined", NULL); } } - } - idlist - { - printdebug("Currently see a function definition taking one paramter (with as) of name %s and number of arguments %d", $1,$6); - } - R_PAREN ASSIGN sblock - ; - + } idlist {printdebug("Currently see a function definition taking one paramter (with as) of name %s and number of arguments %d", + $1,$6);} R_PAREN ASSIGN sblock + ; function_declaration: @@ -403,22 +415,22 @@ ablock: argument_list: +<<<<<<< HEAD expression COMMA argument_list { - CreateEntry(cur, look_up(cur, $1), "", NULL); + CreateEntry(cur, look_up(cur, $1), $1, NULL); $$ = $3 + 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } | expression { - CreateEntry(cur, look_up(cur, $1), "", NULL); + CreateEntry(cur, look_up(cur, $1), $1, NULL); $$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } ; - // will ALWAYS be a TYPE expression: constant @@ -575,6 +587,7 @@ expression: assignable: ID { + //$$ = $1; $$ = getType(look_up(cur,$1)); printdebug("[ASSIGNABLE - RULE 1] assignable = type: %s | ID = %s", $$, $1); } @@ -588,29 +601,40 @@ assignable: { int type = getAdInfoType(look_up(getParent(cur), $1)); printdebug("%stype is %d", COLOR_PURPLE, type); + printdebug("%s", $1); if (type == TYPE_FUNCTION_DECLARATION) { printdebug("%sEntering function call", COLOR_LIGHTGREEN); - if (getAsKeyword(look_up(getParent(cur), $1))) { - TableNode *param = getParameter(look_up(getParent(cur), $1)); + if (look_up(getParent(cur), $1)->additionalinfo->FunDecAdInfo->regularoras) { + printdebug("as function"); + //char *funtype = getType(look_up(cur, $1)); + printdebug("%s", getType(look_up(cur, $1))); + TableNode *param = getParameter(look_up(cur, getType(look_up(cur, $1)))); SymbolTable *recList = getRecList(param); TableNode *lastCheckedRef = getFirstEntry(recList); TableNode *lastCheckedAct = getFirstEntry(cur); while (getNextEntry(lastCheckedRef) != NULL) { - lastCheckedRef = getNextEntry(lastCheckedRef); + lastCheckedRef = getNextEntry(lastCheckedRef); } + + //this isn't very efficient, but will hopefully work while (lastCheckedAct != NULL && lastCheckedRef != NULL) { - if (strcmp(getName(lastCheckedAct), getName(lastCheckedRef)) != 0) { - printdebug("expected %s expression in function call but got %s at line %d and column %d",getType(lastCheckedRef), getName(lastCheckedAct), @3.first_line, @3.first_column); + if (strcmp(getName(lastCheckedAct), getType(lastCheckedRef)) != 0) { + printdebug("expected %s. expression in function call got %s. at line %d and column %d",getType(lastCheckedRef), getName(lastCheckedAct), @3.first_line, @3.first_column); + printdebug("%d", strcmp(getName(lastCheckedAct), getName(lastCheckedRef))); } lastCheckedAct = getNextEntry(lastCheckedAct); TableNode *tn = getFirstEntry(recList); - while (getNextEntry(tn) != lastCheckedRef) { - tn = getNextEntry(tn); - } - lastCheckedRef = tn; - } + + if (tn != lastCheckedRef) { + while (getNextEntry(tn) != lastCheckedRef) { + tn = getNextEntry(tn); + } + lastCheckedRef = tn; + } else {break;} + } + } else { char *expected = getName(getParameter(look_up(getParent(cur), $1))); char *actual = getType(getFirstEntry(cur)); @@ -618,8 +642,7 @@ assignable: printdebug("expected %s expression in function call but got %s at line %d and column %d",expected, actual, @3.first_line, @3.first_column); } } - - $$ = getName(getReturn(table_lookup(getAncestor(cur), $1))); + $$ = getName(getReturn((look_up(cur, getType(look_up(cur, $1)))))); printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", $$, $1); } else if (type == TYPE_ARRAY_TYPE) { From 3bae28dfefb5c061c07f5229b186d1a8dbb4bfc4 Mon Sep 17 00:00:00 2001 From: Annie Date: Thu, 3 Apr 2025 19:04:43 -0400 Subject: [PATCH 02/10] started changing to pass up table nodes --- src/grammar.y | 56 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index cbb9ec1..33599a3 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -47,15 +47,16 @@ %union { int integ; - char * words; + TableNode *tn; + char *words; } %type idlist -%type assignable -%type expression -%type constant -%type id_or_types -%type types +%type assignable +%type expression +%type constant +%type id_or_types +%type types %token ID 101 %token T_INTEGER 201 %token T_ADDRESS 202 @@ -141,36 +142,36 @@ prototype: definition: TYPE ID COLON { - printdebug("Currently see a record definition for %s", $2); + printdebug("Currently see a record definition for %s", $2); tn = CreateEntry(getAncestor(cur), recprime, $2, CreateRecordInfo(0, cur = CreateScope(cur, 0, 0))); - if (table_lookup(getAncestor(cur), $2) == undefined) { + if (look_up(cur, $2) == undefined) { printdebug("rec not found "); } } dblock { - setRecSize(table_lookup(getParent(cur), $2), getRecSize(cur)); + setRecSize(look_up(cur, $2), getRecSize(cur)); cur = getParent(cur); } | TYPE ID COLON C_INTEGER ARROW id_or_types { - printdebug("Currently see a array definition of name %s,storing type %s, of dimensions %d", $2, $6, $4); - CreateEntry(cur, arrayprim, $2, CreateArrayInfo($4, look_up(cur, $6))); - printdebug("%sID: %s, dimensions: %d, typeOfArray: %s", COLOR_GREEN, $2, $4, $6); + printdebug("Currently see a array definition of name %s,storing type %s, of dimensions %d", $2, getName($6), $4); + CreateEntry(cur, arrayprim, $2, CreateArrayInfo($4, $6)); + printdebug("%sID: %s, dimensions: %d, typeOfArray: %s", COLOR_GREEN, $2, $4, getName($6)); } | function_declaration | TYPE ID COLON id_or_types ARROW id_or_types { - printdebug("Currently see a function type definition of name %s,parameter type %s, of return type %s", $2, $4, $6); - CreateEntry(cur,funtypeprime,$2,CreateFunctionTypeInfo(table_lookup(cur,$4),table_lookup(cur,$6))); + printdebug("Currently see a function type definition of name %s,parameter type %s, of return type %s", getName($2), getName($4), getName($6)); + CreateEntry(cur,funtypeprime,$2,CreateFunctionTypeInfo($4 ,$6)); } | ID { - TableNode *node = table_lookup(getAncestor(cur), $1); + TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); } else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION) { @@ -184,11 +185,11 @@ definition: L_PAREN ID { printdebug("Currently see a function definition taking only one parameter (no as) of name %s and argument name %s", $1,$4); - CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); + CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); } R_PAREN ASSIGN sblock - | ID + | ID //EVERYTHING UP UNTIL THIS POINT HAS BEEN CHECKED FOR $TN TYPES { TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { @@ -236,7 +237,7 @@ definition: } } } idlist {printdebug("Currently see a function definition taking one paramter (with as) of name %s and number of arguments %d", - $1,$6);} R_PAREN ASSIGN sblock + $1,$6);} R_PAREN ASSIGN sblock //check sblock type ; @@ -343,7 +344,8 @@ declaration: id_or_types: ID { - printdebug("string of id is %s in ID pattern of id_or_type rule.", $1); $$ = $1; + printdebug("string of id is %s in ID pattern of id_or_type rule.", $1); + $$ = look_up(cur, $1); } | types @@ -415,7 +417,6 @@ ablock: argument_list: -<<<<<<< HEAD expression COMMA argument_list { CreateEntry(cur, look_up(cur, $1), $1, NULL); @@ -587,8 +588,7 @@ expression: assignable: ID { - //$$ = $1; - $$ = getType(look_up(cur,$1)); + $$ = look_up(cur,$1); printdebug("[ASSIGNABLE - RULE 1] assignable = type: %s | ID = %s", $$, $1); } @@ -685,37 +685,37 @@ memOp: constant: C_STRING { - $$ = $1; + $$ = $1; printdebug("string of C_STRING in constant is %s",$1); } | C_INTEGER { - $$ = "integer"; + $$ = integ; printdebug("string of C_INTEGER in constant is integer"); } | C_NULL { - $$ = $1; + $$ = $1; printdebug("string of C_NULL in constant is %s",$1); } | C_CHARACTER { - $$ = $1; + $$ = $1; printdebug("string of C_CHARACTER in constant is %s",$1); } | C_TRUE { - $$ = $1; + $$ = $1; printdebug("string of C_TRUE in constant is %s",$1); } | C_FALSE { - $$ = $1; + $$ = $1; printdebug("string of C_FALSE in constant is %s",$1); } From 0eb0b8097ce935f45765aa9d05b06ca2bf6421f1 Mon Sep 17 00:00:00 2001 From: Partho Date: Thu, 3 Apr 2025 20:05:53 -0400 Subject: [PATCH 03/10] updated lex to return the right values to the tokens (mostly table entries) --- src/grammar.y | 28 ++++++++++++++-------------- src/lexicalStructure.lex | 28 +++++++++++++++++++--------- src/symbol_table.c | 20 ++++++++++++++++++++ 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index 33599a3..8481152 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -47,28 +47,28 @@ %union { int integ; - TableNode *tn; - char *words; + char* words; + TableNode* tn; } %type idlist %type assignable %type expression -%type constant +%type constant %type id_or_types %type types -%token ID 101 -%token T_INTEGER 201 -%token T_ADDRESS 202 -%token T_BOOLEAN 203 -%token T_CHARACTER 204 -%token T_STRING 205 +%token ID 101 +%token T_INTEGER 201 +%token T_ADDRESS 202 +%token T_BOOLEAN 203 +%token T_CHARACTER 204 +%token T_STRING 205 %token C_INTEGER 301 -%token C_NULL 302 -%token C_CHARACTER 303 -%token C_STRING 304 -%token C_TRUE 305 -%token C_FALSE 306 +%token C_NULL 302 +%token C_CHARACTER 303 +%token C_STRING 304 +%token C_TRUE 305 +%token C_FALSE 306 %token WHILE 401 %token IF 402 %token THEN 403 diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index 920cdc4..940681a 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -13,6 +13,16 @@ #endif extern SymbolTable * cur; extern FILE* tok_flag; + extern TableNode *funprime; + extern TableNode *funtypeprime; + extern TableNode *arrayprim; + extern TableNode *recprime; + extern TableNode *integ; + extern TableNode *addr; + extern TableNode *chara; + extern TableNode *stri; + extern TableNode *boo; + extern TableNode *undefined; extern void incr(int lnum,int cnum, int tok); extern void print_tok(int tok); @@ -36,10 +46,10 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] %% -"integer" {if(DEBUG) {printf( "T_INTEGER: %s (%d)\n", yytext, T_INTEGER);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.words = strdup(yytext);return T_INTEGER;}} -"address" {if(DEBUG) {printf( "T_ADDRESS: %s (%d)\n", yytext, T_ADDRESS);} else {if(tok_flag != NULL){print_tok(T_ADDRESS);}incr(line_number,column_number,T_ADDRESS);yylval.words = strdup(yytext);return T_ADDRESS;}} -"Boolean" {if(DEBUG) {printf( "T_BOOLEAN: %s (%d)\n", yytext, T_BOOLEAN);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.words = strdup(yytext);return T_BOOLEAN;}} -"character" {if(DEBUG) {printf( "T_CHARACTER: %s (%d)\n", yytext, T_CHARACTER);} else {if(tok_flag != NULL){print_tok(T_CHARACTER);}incr(line_number,column_number,T_CHARACTER);yylval.words = strdup(yytext);return T_CHARACTER;}} +"integer" {if(DEBUG) {printf( "T_INTEGER: %s (%d)\n", yytext, T_INTEGER);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.tn = integ;return T_INTEGER;}} +"address" {if(DEBUG) {printf( "T_ADDRESS: %s (%d)\n", yytext, T_ADDRESS);} else {if(tok_flag != NULL){print_tok(T_ADDRESS);}incr(line_number,column_number,T_ADDRESS);yylval.tn = addr;return T_ADDRESS;}} +"Boolean" {if(DEBUG) {printf( "T_BOOLEAN: %s (%d)\n", yytext, T_BOOLEAN);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.tn = boo;return T_BOOLEAN;}} +"character" {if(DEBUG) {printf( "T_CHARACTER: %s (%d)\n", yytext, T_CHARACTER);} else {if(tok_flag != NULL){print_tok(T_CHARACTER);}incr(line_number,column_number,T_CHARACTER);yylval.tn = chara;return T_CHARACTER;}} "while" {if(DEBUG) {printf( "WHILE: %s (%d)\n", yytext, WHILE);} else {if(tok_flag != NULL){print_tok(WHILE);}incr(line_number,column_number,WHILE);return WHILE;}} "if" {if(DEBUG) {printf( "IF: %s (%d)\n", yytext, IF);} else {if(tok_flag != NULL){print_tok(IF);}incr(line_number,column_number,IF);return IF;}} @@ -73,8 +83,8 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] "->" {if(DEBUG) {printf( "ARROW: %s (%d)\n", yytext, ARROW);} else {if(tok_flag != NULL){print_tok(ARROW);}incr(line_number,column_number,ARROW);return ARROW;}} {DIGIT}+ {if(DEBUG) {printf( "C_INTEGER: %s (%d)\n", yytext, C_INTEGER);} else {if(tok_flag != NULL){print_tok(C_INTEGER);}incr(line_number,column_number,C_INTEGER);yylval.integ = atoi(yytext)/*words = strdup("integer")*/;return C_INTEGER;}} -'{CHAR}' {if(DEBUG) {printf( "C_CHARACTER: %s (%d)\n", yytext, C_CHARACTER);} else {if(tok_flag != NULL){print_tok(C_CHARACTER);}incr(line_number,column_number,C_CHARACTER);yylval.words = strdup("character");return C_CHARACTER;}} -\"{SCHAR}*\" {if(DEBUG) {printf( "C_STRING: %s (%d)\n", yytext, C_STRING);} else {if(tok_flag != NULL){print_tok(C_STRING);}incr(line_number,column_number,C_STRING);yylval.words = strdup("string");return C_STRING;}} +'{CHAR}' {if(DEBUG) {printf( "C_CHARACTER: %s (%d)\n", yytext, C_CHARACTER);} else {if(tok_flag != NULL){print_tok(C_CHARACTER);}incr(line_number,column_number,C_CHARACTER);yylval.tn = chara;return C_CHARACTER;}} +\"{SCHAR}*\" {if(DEBUG) {printf( "C_STRING: %s (%d)\n", yytext, C_STRING);} else {if(tok_flag != NULL){print_tok(C_STRING);}incr(line_number,column_number,C_STRING);yylval.tn = stri;return C_STRING;}} {COMMENT} {if(DEBUG) {printf( "COMMENT: %s (%d)\n", yytext, COMMENT);} else {if(tok_flag != NULL){print_tok(COMMENT);}incr(line_number,column_number,COMMENT);/*return COMMENT;*/}} "(" {if(DEBUG) {printf( "L_PAREN: %s (%d)\n", yytext, L_PAREN);} else {if(tok_flag != NULL){print_tok(L_PAREN);}incr(line_number,column_number,L_PAREN);return L_PAREN;}} @@ -84,9 +94,9 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] "{" {if(DEBUG) {printf( "L_BRACE: %s (%d)\n", yytext, L_BRACE);} else {if(tok_flag != NULL){print_tok(L_BRACE);}incr(line_number,column_number,L_BRACE);return L_BRACE;}} "}" {if(DEBUG) {printf( "R_BRACE: %s (%d)\n", yytext, R_BRACE);} else {if(tok_flag != NULL){print_tok(R_BRACE);}incr(line_number,column_number,R_BRACE);return R_BRACE;}} -"true" {if(DEBUG) {printf( "C_TRUE: %s (%d)\n", yytext, C_TRUE);} else {if(tok_flag != NULL){print_tok(C_TRUE);}incr(line_number,column_number,C_TRUE);yylval.words = strdup("Boolean");return C_TRUE;}} -"false" {if(DEBUG) {printf( "C_FALSE: %s (%d)\n", yytext, C_FALSE);} else {if(tok_flag != NULL){print_tok(C_FALSE);}incr(line_number,column_number,C_FALSE);yylval.words = strdup("Boolean");return C_FALSE;}} -"null" {if(DEBUG) {printf( "C_NULL: %s (%d)\n", yytext, C_NULL);} else {if(tok_flag != NULL){print_tok(C_NULL);}incr(line_number,column_number,C_NULL);yylval.words = strdup("address");return C_NULL;}} +"true" {if(DEBUG) {printf( "C_TRUE: %s (%d)\n", yytext, C_TRUE);} else {if(tok_flag != NULL){print_tok(C_TRUE);}incr(line_number,column_number,C_TRUE);yylval.tn = boo;return C_TRUE;}} +"false" {if(DEBUG) {printf( "C_FALSE: %s (%d)\n", yytext, C_FALSE);} else {if(tok_flag != NULL){print_tok(C_FALSE);}incr(line_number,column_number,C_FALSE);yylval.tn = boo;return C_FALSE;}} +"null" {if(DEBUG) {printf( "C_NULL: %s (%d)\n", yytext, C_NULL);} else {if(tok_flag != NULL){print_tok(C_NULL);}incr(line_number,column_number,C_NULL);yylval.tn = addr;return C_NULL;}} {ID} {if(DEBUG) {printf( "ID: %s (%d)\n", yytext, ID);} else {if(tok_flag != NULL){print_tok(ID);}incr(line_number,column_number,ID);yylval.words = strdup(yytext); return ID;}} diff --git a/src/symbol_table.c b/src/symbol_table.c index 97b4eac..ec960e1 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -769,6 +769,26 @@ TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id, } } +TableNode *getTypeEntry(TableNode *tn) { + if (tn == NULL) { + printdebug("passed a NULL table entry to getType"); + return undefined; + } + if (tn == undefined) { + printdebug("passed an undefined table entry to getType"); + return undefined; + } + if (tn->theType == NULL) { + printdebug("type of entry is currently NULL type"); + return undefined; + } + if (tn->theType == undefined) { + printdebug("type of entry is currently undefined type"); + return undefined; + } + return tn->theType; +} + char *getType(TableNode *tn) { if (tn == NULL) { printdebug("passed a NULL table entry to getType"); From 9b73c657467c973e703fc4664b732a6c7737aeb4 Mon Sep 17 00:00:00 2001 From: Annie Date: Thu, 3 Apr 2025 17:34:18 -0400 Subject: [PATCH 04/10] allow renaming of tablenodes --- src/symbol_table.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/symbol_table.c b/src/symbol_table.c index ec960e1..70f28d5 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -390,8 +390,8 @@ bool getAsKeyword(TableNode *definition) { } if (strcmp(getType(definition), "primitive function") != 0) { printdebug( - "not checking if a function is called with as or not -- " - "invalid op"); + "not checking if a function is called with as or not (%s) -- " + "invalid op", getType(definition)); return 0; } return definition->additionalinfo->FunDecAdInfo->regularoras; @@ -856,6 +856,11 @@ TableNode *addName(TableNode *tn, char *str) { printdebug( "Name doesn't look like it is empty before you change. " "Are you sure you need to update name?"); + if (str != NULL) { + tn->theName = str; + return tn; + } + printdebug("passed a NULL string to the addName function"); return undefined; } if (str == NULL) { @@ -1322,4 +1327,4 @@ TableNode *getNextEntry(TableNode *tn) { printdebug("The type of the first entry is %s",First_Entry->theType); return 0; } - */ \ No newline at end of file + */ From 4f62851575eec84cb9c7c2ff1a336130eb8659c0 Mon Sep 17 00:00:00 2001 From: Annie Date: Thu, 3 Apr 2025 17:40:06 -0400 Subject: [PATCH 05/10] reseting carl's mistake to what it should be from my changes --- tests/sprint2/test/sp2_carls_mistake.alpha | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sprint2/test/sp2_carls_mistake.alpha b/tests/sprint2/test/sp2_carls_mistake.alpha index 2f4c1ef..daca47e 100644 --- a/tests/sprint2/test/sp2_carls_mistake.alpha +++ b/tests/sprint2/test/sp2_carls_mistake.alpha @@ -25,4 +25,4 @@ entry(arg) := { result := bar1(w); (* pass w (a rec type value) to bar1 *) result := bar2(5,7); (* implicitly build a rec type value, assign 5 and 7 to fields x and y, but call them r and s *) return 0; -} +} \ No newline at end of file From 5e749eb1ac80c9338de329db044c2c49580554e6 Mon Sep 17 00:00:00 2001 From: Annie Date: Fri, 4 Apr 2025 10:16:45 -0400 Subject: [PATCH 06/10] updated 3756156 to use table nodes up until comment in grammar.y --- src/grammar.y | 144 +++++++++++++++++++++++++------------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index 8481152..7b39031 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -189,9 +189,9 @@ definition: } R_PAREN ASSIGN sblock - | ID //EVERYTHING UP UNTIL THIS POINT HAS BEEN CHECKED FOR $TN TYPES + | ID { - TableNode *node = table_lookup(getAncestor(cur), $1); + TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { printdebug("null check"); } @@ -210,7 +210,7 @@ definition: CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); }R_PAREN ASSIGN sblock | ID { - TableNode *node = table_lookup(getAncestor(cur), $1); + TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); }else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION){ @@ -223,7 +223,7 @@ definition: } cur = CreateScope(cur, 0, 0); }AS L_PAREN { - TableNode *parameter = getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))); + TableNode *parameter = getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))); printdebug("parameter type: %s", getType(parameter)); if (parameter == undefined) { printdebug("function defined with as, but parameter is undefined at line %d, column %d", @1.first_line, @1.first_column); @@ -265,11 +265,11 @@ idlist: if (getNextEntry(entry) == NULL) { printdebug("too many parameters at line %d column %d", @1.first_line, @1.first_column); } - addName(entry, $1); + addName(entry, 1); } COMMA idlist { - $$ = $4 + 1; + $$ = $4 + 1; } | ID @@ -334,8 +334,8 @@ declaration_list: declaration: id_or_types COLON ID { - printdebug("ID/TYPE: %s, ID: %s", $1, $3) ; - CreateEntry(cur,table_lookup(getAncestor(cur),$1),$3,NULL); + printdebug("ID/TYPE: %s, ID: %s", getName($1), $3) ; + CreateEntry(cur,$1,$3,NULL); } ; @@ -350,7 +350,7 @@ id_or_types: | types { - printdebug("string of type is %s in types pattern of id_or_type rule.",$1); + printdebug("string of type is %s in types pattern of id_or_type rule.",getName($1)); $$ = $1; } ; @@ -377,22 +377,22 @@ compound_statement: simple_statement: assignable ASSIGN expression { - if(strcmp($1, $3) == 0) { + if(strcmp(getType($1), getType($3)) == 0) { printdebug("Passed standard type check; assignable = expression"); - } else if((strcmp(getType(look_up(cur, $1)), "array") == 0) && (strcmp($3, "address") == 0)) { - printdebug("%s[☺] Passed array type check; %s = %s", COLOR_GREEN, $1, $3); - } else if((strcmp(getType(look_up(cur, $1)), "record") == 0) && (strcmp($3, "address") == 0)) { - printdebug("%s[☺] Passed address type check; %s = %s", COLOR_GREEN, $1, $3); - } else if((strcmp(getType(look_up(cur, $1)), "function type primitive") == 0) && (strcmp($3, "address") == 0)) { - printdebug("%s[☺] Passed function type primitive type check; %s = %s", COLOR_GREEN, $1, $3); + } else if((strcmp(getType($1), "array") == 0) && (strcmp($3, "address") == 0)) { + printdebug("%s[☺] Passed array type check; %s = %s", COLOR_GREEN, getType($1), getType($3)); + } else if((strcmp(getType($1), "record") == 0) && (strcmp($3, "address") == 0)) { + printdebug("%s[☺] Passed address type check; %s = %s", COLOR_GREEN, getType($1), getType($3)); + } else if((strcmp(getType($1), "function type primitive") == 0) && (strcmp(getType($3), "address") == 0)) { + printdebug("%s[☺] Passed function type primitive type check; %s = %s", COLOR_GREEN, getType($1), getType($3)); // } else if () { // } else if(strcmp(getType(table_lookup(cur, $1)), getType(table_lookup(cur, $3))) == 0) { // printdebug("%s[] Passed double lookup type check; %s = %s", COLOR_GREEN, $1, $3); } else { printdebug("%s[TYPE ERROR] %sMismatch at %sline %d and column %d%s", COLOR_ORANGE, COLOR_WHITE, COLOR_YELLOW, @2.first_line, @2.first_column, COLOR_WHITE); - printdebug(" - Invalid types %s$1: %s and $3: %s%s", COLOR_YELLOW, $1, $3, COLOR_WHITE); - printdebug(" - %sgetType for address: %s", COLOR_YELLOW, getType(look_up(cur, $1))); + printdebug(" - Invalid types %s$1: %s and $3: %s%s", COLOR_YELLOW, getType($1), getType($3), COLOR_WHITE); + printdebug(" - %sgetType for address: %s", COLOR_YELLOW, getType($1)); } } @@ -409,8 +409,8 @@ rec_op: ablock: L_PAREN argument_list R_PAREN { - $$ = $2; - printdebug("ablock is %d", $$); + $$ = $2; + printdebug("ablock is %d", $$); } ; @@ -419,15 +419,15 @@ ablock: argument_list: expression COMMA argument_list { - CreateEntry(cur, look_up(cur, $1), $1, NULL); - $$ = $3 + 1; - printdebug("[ARGUMENT_LIST] argument list is %d", $$); + CreateEntry(cur, $1, getName($1), NULL); + $$ = $3 + 1; + printdebug("[ARGUMENT_LIST] argument list is %d", $$); } | expression { - CreateEntry(cur, look_up(cur, $1), $1, NULL); - $$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); + CreateEntry(cur, $1, getName($1), NULL); + $$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } ; @@ -437,15 +437,15 @@ expression: constant { printdebug("constant expression"); - $$ = $1; + $$ = $1; } | SUB_OR_NEG expression %prec UMINUS { printdebug("negative expression"); - if(strcmp($2,"integer") != 0) { + if($2 != integ) { printdebug("cant negate something not an integer at line %d and column %d",@2.first_line,@2.first_column); - $$=strdup("undefined"); + $$=undefined; } else { $$=$2; } @@ -454,133 +454,133 @@ expression: | NOT expression { printdebug("not expression"); - if(strcmp($2,"Boolean")==0) { + if($2 == boo) { $$=$2; } else { - $$=strdup("undefined"); - printdebug("mismatch at line %d and column %d. Invalid type being negated is %s", @1.first_line,@1.first_column,$2); + $$=undefined; + printdebug("mismatch at line %d and column %d. Invalid type being negated is %s", @1.first_line,@1.first_column,getName($2)); } } | expression ADD expression { printdebug("add expression"); - if(strcmp($1,$3)==0 && strcmp($1,"integer")==0) { - $$=strdup("integer"); + if($1 == $3 && $1 == integ) { + $$=$1; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression SUB_OR_NEG expression { printdebug("sub or neg expression"); - if(strcmp($1,$3)==0 &&strcmp($1,"integer")==0) { - $$=strdup("integer"); + if($1 == $3 && $1 == integ) { + $$=$1; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression MUL expression { printdebug("multiply expression"); - if(strcmp($1,$3)==0 &&strcmp($1,"integer")==0) { - $$=strdup("integer"); + if($1 == $3 && $1 == integ) { + $$=$1; } else{ - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression DIV expression { printdebug("divide expression"); - if(strcmp($1,$3)==0 && strcmp($1,"integer")==0) { - $$=strdup("integer"); + if(strcmp($1 == $3 && $1 == integ) { + $$=$1; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression REM expression { printdebug("remainder expression"); - if(strcmp($1,$3)==0 && strcmp($1,"integer")==0) { - $$=strdup("integer"); + if($1 == $3 && $1 == integ) { + $$=$1; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression AND expression { printdebug("AND expression"); - if(strcmp($1,$3)==0 && strcmp($1,"Boolean")==0) { - $$=strdup("Boolean"); + if($1 == $3 && $1 == boo { + $$=$1; } else{ - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression OR expression { printdebug("OR"); - if(strcmp($1,$3)==0 && strcmp($1,"Boolean")==0) { - $$=strdup("Boolean"); + if(strcmp($1 == $3 && $1 == boo) { + $$=$1; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } - + | expression LESS_THAN expression { printdebug("less than expression"); - if(strcmp($1,$3)==0 && strcmp($1,"integer")==0) { - $$=strdup("Boolean"); + if($1 == $3 && $1==integ) { + $$=boo; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); + $$=undefined; } } | expression EQUAL_TO expression { printdebug("equals check expression"); - if(strcmp($1,$3)==0) { - $$=strdup("Boolean"); + if($1 == $3 && $1 != undefined) { + $$=boo; } else { - printdebug("mismatch at line %d and column %d. Invalid types %s and %s", @2.first_line,@2.first_column,$1,$3); - $$=strdup("undefined"); + printdebug("mismatch at line %d and column %d. Invalid types %s and %s", @2.first_line,@2.first_column,getName($1),getName($3)); + $$ = undefined; } } | assignable { printdebug("assignable expression. current type is %s",$1); - $$=$1; + $$= getTypeEntry($1);//idk if this is correct } | L_PAREN expression R_PAREN { - printdebug("paren expression. current type is %s",$2); + printdebug("paren expression. current type is %s",getName($2)); $$=$2; } | memOp assignable { - $$ = strdup("address"); + $$ = addr; } ; - +//UPDATED $$ for tablenodes to this point // prolly right, check back with me later // add array case From f6abbbd67ffad3ddc8200be31dedc4f301bdea71 Mon Sep 17 00:00:00 2001 From: Partho Date: Fri, 4 Apr 2025 20:24:05 -0400 Subject: [PATCH 07/10] updated to change strings to nodes in most locations --- src/grammar.y | 151 +++++++++++------ src/symbol_table.c | 397 +++++++++++++++++++++++++-------------------- src/symbol_table.h | 8 + 3 files changed, 327 insertions(+), 229 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index 7b39031..119960a 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -43,21 +43,23 @@ TableNode * tn; %} -%locations - %union { int integ; char* words; - TableNode* tn; + void* tn; } +%locations + %type idlist %type assignable %type expression %type constant %type id_or_types %type types -%token ID 101 +%type argument_list +%type ablock +%token ID 101 %token T_INTEGER 201 %token T_ADDRESS 202 %token T_BOOLEAN 203 @@ -143,13 +145,15 @@ definition: TYPE ID COLON { printdebug("Currently see a record definition for %s", $2); - tn = CreateEntry(getAncestor(cur), recprime, $2, CreateRecordInfo(0, cur = CreateScope(cur, 0, 0))); + tn = CreateEntry(getAncestor(cur),TYPE_RECORD_TYPE, recprime, $2, CreateRecordInfo(0, cur = CreateScope(cur, 0, 0))); if (look_up(cur, $2) == undefined) { - printdebug("rec not found "); + printdebug("rec not found"); } } dblock { + //We are scanning through the dblock scope to get the length of the dblock (num of elements) from getRecSize + //and then putting it in the entry that we created above. setRecSize(look_up(cur, $2), getRecSize(cur)); cur = getParent(cur); } @@ -157,7 +161,7 @@ definition: | TYPE ID COLON C_INTEGER ARROW id_or_types { printdebug("Currently see a array definition of name %s,storing type %s, of dimensions %d", $2, getName($6), $4); - CreateEntry(cur, arrayprim, $2, CreateArrayInfo($4, $6)); + CreateEntry(cur,TYPE_ARRAY_TYPE, arrayprim, $2, CreateArrayInfo($4, $6)); printdebug("%sID: %s, dimensions: %d, typeOfArray: %s", COLOR_GREEN, $2, $4, getName($6)); } @@ -165,8 +169,8 @@ definition: | TYPE ID COLON id_or_types ARROW id_or_types { - printdebug("Currently see a function type definition of name %s,parameter type %s, of return type %s", getName($2), getName($4), getName($6)); - CreateEntry(cur,funtypeprime,$2,CreateFunctionTypeInfo($4 ,$6)); + printdebug("Currently see a function type definition of name %s,parameter type %s, of return type %s", $2, getName($4), getName($6)); + CreateEntry(cur,TYPE_FUNCTION_TYPE,funtypeprime,$2,CreateFunctionTypeInfo($4 ,$6)); } | ID @@ -185,11 +189,25 @@ definition: L_PAREN ID { printdebug("Currently see a function definition taking only one parameter (no as) of name %s and argument name %s", $1,$4); - CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); + TableNode* type_of_param = getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))); + int type_of_param_type = getAdInfoType(type_of_param); + if( type_of_param_type == TYPE_UNDEFINED + || type_of_param_type == TYPE_FUNCTION_DECLARATION + || type_of_param_type == TYPE_ARRAY + || type_of_param_type == TYPE_ALL_ELSE + || type_of_param_type == TYPE_SYSTEM_DEFINED + || type_of_param_type == TYPE_STRING){ // note that strings are actually arrays so this is unused + printdebug("type of parameter is undefined or invalid at line %d, column %d", @4.first_line, @4.first_column); + type_of_param_type = TYPE_UNDEFINED; // setting tag as undefined in these cases + }else{ + printdebug("type of parameter is %s at line %d, column %d", getName(type_of_param), @4.first_line, @4.first_column); + } + + CreateEntry(cur,type_of_param_type, type_of_param, $4, getAdInfo(type_of_param)); } - R_PAREN ASSIGN sblock + R_PAREN ASSIGN sblock //leaving scope is being taken care of in sblock - | ID + /* | ID { TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { @@ -208,13 +226,13 @@ definition: printdebug("Currently see a function definition taking only one parameter (no as) of name %s and argument name %s", $1,$4); CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); - }R_PAREN ASSIGN sblock + }R_PAREN ASSIGN sblock */ | ID { TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { - printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); + printdebug(" undefined nodedeclared at line %d, column %d", @1.first_line, @1.first_column); }else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION){ - printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); + printdebug("not a valid function declaration at line %d, column %d", @1.first_line, @1.first_column); } else { printdebug("setting as keyword to true"); @@ -232,9 +250,26 @@ definition: printdebug("function defined with as, but parameter is type %s at line %d, column %d", getType(parameter),@1.first_line, @1.first_column); }else { for (TableNode* entry = getFirstEntry(getRecList(parameter)); entry!= NULL; entry = getNextEntry(entry)){ - printdebug("creating entry of type %s for function", getType(entry)); - CreateEntry(cur, entry, "undefined", NULL); + int type_of_param_type = getAdInfoType(entry); + if( type_of_param_type == TYPE_UNDEFINED + || type_of_param_type == TYPE_FUNCTION_DECLARATION + || type_of_param_type == TYPE_ARRAY + || type_of_param_type == TYPE_ALL_ELSE + || type_of_param_type == TYPE_SYSTEM_DEFINED + || type_of_param_type == TYPE_STRING){ // note that strings are actually arrays so this is unused + printdebug("type of parameter being passed in to AS function definition is %s which is invalid", getName(entry)); + type_of_param_type = TYPE_UNDEFINED; // setting tag as undefined in these cases + }else{ + printdebug("type of parameter correctly being passed in to AS function definition is %s which is valid", getName(entry)); + } + if(type_of_param_type == TYPE_UNDEFINED){ + CreateEntry(cur,type_of_param_type, undefined, NULL, NULL); + } else { + CreateEntry(cur,type_of_param_type, entry, NULL, getAdInfo(entry)); + /*printdebug("creating entry of type %s for function", getType(entry)); + CreateEntry(cur, getTypeEntry(entry), "undefined", NULL);*/ } + } } } idlist {printdebug("Currently see a function definition taking one paramter (with as) of name %s and number of arguments %d", $1,$6);} R_PAREN ASSIGN sblock //check sblock type @@ -244,12 +279,12 @@ definition: function_declaration: FUNCTION ID COLON ID { - CreateEntry(cur, look_up(cur, $4), $2, CreateFunctionDeclarationInfo(-1, false)); + CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $4), $2, CreateFunctionDeclarationInfo(-1, false)); } | EXTERNAL FUNCTION ID COLON ID { - CreateEntry(cur, look_up(cur, $5), $3, NULL); + CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $5), $3, NULL); } ; @@ -265,7 +300,7 @@ idlist: if (getNextEntry(entry) == NULL) { printdebug("too many parameters at line %d column %d", @1.first_line, @1.first_column); } - addName(entry, 1); + addName(entry, $1); } COMMA idlist { @@ -290,8 +325,11 @@ idlist: sblock: L_BRACE { - if (getLine(cur) != 0 && getColumn(cur)) { + if (getLine(cur) != 0) { cur = CreateScope(cur,@1.first_line,@1.first_column); + } else { + setLineNumber(cur, @1.first_line); + setColumnNumber(cur,@1.first_line); } } statement_list @@ -302,8 +340,11 @@ sblock: | L_BRACE { - if (getLine(cur) != 0 && getColumn(cur)) { + if (getLine(cur) != 0) { cur = CreateScope(cur,@1.first_line,@1.first_column); + } else { + setLineNumber(cur, @1.first_line); + setColumnNumber(cur,@1.first_line); } } dblock @@ -320,7 +361,15 @@ sblock: dblock: - L_BRACKET declaration_list R_BRACKET; + L_BRACKET + {if(getLine(cur)==0){ + setLineNumber(cur, @1.first_line); + setColumnNumber(cur,@1.first_line);} + else{ + cur = CreateScope(cur,@1.first_line,@1.first_column); + } + } + declaration_list R_BRACKET; @@ -335,7 +384,7 @@ declaration: id_or_types COLON ID { printdebug("ID/TYPE: %s, ID: %s", getName($1), $3) ; - CreateEntry(cur,$1,$3,NULL); + CreateEntry(cur,getAdInfoType($1),$1,$3,getAdInfo($1)); } ; @@ -369,7 +418,7 @@ statement_list: compound_statement: WHILE L_PAREN expression R_PAREN sblock | IF L_PAREN expression R_PAREN THEN sblock ELSE sblock - | sblock + | sblock ; @@ -377,14 +426,14 @@ compound_statement: simple_statement: assignable ASSIGN expression { - if(strcmp(getType($1), getType($3)) == 0) { + if(strcmp(getName($1), getName($3)) == 0) { printdebug("Passed standard type check; assignable = expression"); - } else if((strcmp(getType($1), "array") == 0) && (strcmp($3, "address") == 0)) { - printdebug("%s[☺] Passed array type check; %s = %s", COLOR_GREEN, getType($1), getType($3)); - } else if((strcmp(getType($1), "record") == 0) && (strcmp($3, "address") == 0)) { - printdebug("%s[☺] Passed address type check; %s = %s", COLOR_GREEN, getType($1), getType($3)); - } else if((strcmp(getType($1), "function type primitive") == 0) && (strcmp(getType($3), "address") == 0)) { - printdebug("%s[☺] Passed function type primitive type check; %s = %s", COLOR_GREEN, getType($1), getType($3)); + } else if((strcmp(getName($1), "array") == 0) && (strcmp(getName($3), "address") == 0)) { + printdebug("%s[☺] Passed array type check; %s = %s", COLOR_GREEN, getName($1), getName($3)); + } else if((strcmp(getName($1), "record") == 0) && (strcmp(getName($3), "address") == 0)) { + printdebug("%s[☺] Passed address type check; %s = %s", COLOR_GREEN, getName($1), getName($3)); + } else if((strcmp(getName($1), "function type primitive") == 0) && (strcmp(getName($3), "address") == 0)) { + printdebug("%s[☺] Passed function type primitive type check; %s = %s", COLOR_GREEN, getName($1), getName($3)); // } else if () { // } else if(strcmp(getType(table_lookup(cur, $1)), getType(table_lookup(cur, $3))) == 0) { @@ -419,14 +468,14 @@ ablock: argument_list: expression COMMA argument_list { - CreateEntry(cur, $1, getName($1), NULL); + CreateEntry(cur,getAdInfoType($1), $1, getName($1), NULL); $$ = $3 + 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } | expression { - CreateEntry(cur, $1, getName($1), NULL); + CreateEntry(cur,getAdInfoType($1),$1, getName($1), NULL); $$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } ; @@ -498,7 +547,7 @@ expression: | expression DIV expression { printdebug("divide expression"); - if(strcmp($1 == $3 && $1 == integ) { + if((strcmp(getName($1),getName($3))==0) && ($1 == integ)) { $$=$1; } else { printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); @@ -520,7 +569,7 @@ expression: | expression AND expression { printdebug("AND expression"); - if($1 == $3 && $1 == boo { + if($1 == $3 && $1 == boo){ $$=$1; } else{ printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); @@ -531,7 +580,7 @@ expression: | expression OR expression { printdebug("OR"); - if(strcmp($1 == $3 && $1 == boo) { + if((strcmp(getName($1),getName($3))==0) && $1 == boo) { $$=$1; } else { printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3)); @@ -599,17 +648,17 @@ assignable: } ablock { - int type = getAdInfoType(look_up(getParent(cur), $1)); + int type = getAdInfoType(look_up(cur, getName($1))); printdebug("%stype is %d", COLOR_PURPLE, type); printdebug("%s", $1); if (type == TYPE_FUNCTION_DECLARATION) { printdebug("%sEntering function call", COLOR_LIGHTGREEN); - if (look_up(getParent(cur), $1)->additionalinfo->FunDecAdInfo->regularoras) { + if (look_up(getParent(cur), getName($1))->additionalinfo->FunDecAdInfo->regularoras) { printdebug("as function"); //char *funtype = getType(look_up(cur, $1)); - printdebug("%s", getType(look_up(cur, $1))); - TableNode *param = getParameter(look_up(cur, getType(look_up(cur, $1)))); + printdebug("%s", getType(look_up(cur, getName($1)))); + TableNode *param = getParameter(look_up(cur, getType(look_up(cur, getName($1))))); SymbolTable *recList = getRecList(param); TableNode *lastCheckedRef = getFirstEntry(recList); TableNode *lastCheckedAct = getFirstEntry(cur); @@ -636,32 +685,32 @@ assignable: } } else { - char *expected = getName(getParameter(look_up(getParent(cur), $1))); + char *expected = getName(getParameter(look_up(getParent(cur), getName($1)))); char *actual = getType(getFirstEntry(cur)); if (strcmp(expected, actual) != 0) { printdebug("expected %s expression in function call but got %s at line %d and column %d",expected, actual, @3.first_line, @3.first_column); } } - $$ = getName(getReturn((look_up(cur, getType(look_up(cur, $1)))))); - printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", $$, $1); + $$ = getReturn((look_up(cur, getType(look_up(cur, getName($1)))))); + printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName($$), getName($1)); } else if (type == TYPE_ARRAY_TYPE) { printdebug("%sEntering array call", COLOR_LIGHTGREEN); - if (getNumArrDim(look_up(getParent(cur), $1)) != $2) { - printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, $1)), $2, @2.first_line, @2.first_column); + if (getNumArrDim(look_up(getParent(cur), getName($1))) != $2) { + printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, getName($1))), $2, @2.first_line, @2.first_column); } - $$ = getName(getArrType(look_up(getParent(cur), $1))); - printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", $$, $1); + $$ = getArrType(look_up(getParent(cur), getName($1))); + printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName($$), getName($1)); } cur = getParent(cur); } | assignable rec_op ID { - if(undefined != table_lookup(getRecList(table_lookup(getAncestor(cur), $1)), $3)) { - $$ = getName(table_lookup(getRecList(table_lookup(getAncestor(cur), $1)), $3)); + if(undefined != table_lookup(getRecList(table_lookup(getAncestor(cur), getName($1))), $3)) { + $$ = table_lookup(getRecList(table_lookup(getAncestor(cur), getName($1))), $3); } - printdebug("[ASSIGNABLE - RULE 3] assignable = type: %s | ID = %s", $$, $1); + printdebug("[ASSIGNABLE - RULE 3] assignable = type: %s | ID = %s", getName($$), $1); } ; diff --git a/src/symbol_table.c b/src/symbol_table.c index 70f28d5..2e1af13 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -85,7 +85,8 @@ typedef enum { TYPE_ALL_ELSE = 7, TYPE_UNDEFINED = 8, TYPE_RECORD = 9, - TYPE_ARRAY = 10 + TYPE_ARRAY = 10, + TYPE_SYSTEM_DEFINED = 11 // for system defined entries like funprimetype etc. } types; @@ -314,7 +315,7 @@ int getRecSize(SymbolTable *tn) { "passed in NULL SymbolTable for getRecSize. Invalid"); return -1; } - int s = 0; + int s = 1; TableNode *cur = getFirstEntry(tn); if (cur != NULL) { while (getNextEntry(cur) != NULL) { @@ -551,6 +552,7 @@ SymbolTable *init(SymbolTable *start) { prime->theType = NULL; prime->additionalinfo = NULL; prime->next = NULL; + prime->tag = TYPE_SYSTEM_DEFINED; // not sure exatly how to get array types to look right so using a dummy // Table Node below and updating the print symbol table function to @@ -560,7 +562,8 @@ SymbolTable *init(SymbolTable *start) { arrayprim->theName = "array"; arrayprim->theType = NULL; arrayprim->additionalinfo = NULL; - prime->next = NULL; + arrayprim->next = NULL; + prime->tag = TYPE_SYSTEM_DEFINED; // funprime = CreateEntry(NULL,NULL,strdup("function primitive"),NULL); @@ -570,6 +573,7 @@ SymbolTable *init(SymbolTable *start) { funprime->theType = NULL; funprime->additionalinfo = NULL; funprime->next = NULL; + funprime->tag = TYPE_SYSTEM_DEFINED; // record recprime = (TableNode *)malloc(sizeof(TableNode)); @@ -577,18 +581,21 @@ SymbolTable *init(SymbolTable *start) { recprime->theType = NULL; recprime->additionalinfo = NULL; recprime->next = NULL; + recprime->tag = TYPE_SYSTEM_DEFINED; funtypeprime = (TableNode *)malloc(sizeof(TableNode)); funtypeprime->theName = "primitive function type"; funtypeprime->theType = NULL; funtypeprime->additionalinfo = NULL; funtypeprime->next = NULL; + funtypeprime->tag = TYPE_SYSTEM_DEFINED; undefined = (TableNode *)malloc(sizeof(TableNode)); undefined->theName = "undefined"; undefined->theType = NULL; undefined->additionalinfo = NULL; undefined->next = NULL; + undefined->tag = TYPE_SYSTEM_DEFINED; // Undefined_function_type_info = CreateFunctionTypeInfo(undefined, // undefined); @@ -605,11 +612,17 @@ SymbolTable *init(SymbolTable *start) { // be the size of these primitive types. We can change these if needed // to not be hard coded numbers as a reminder, stri below is defined as // a one dimensional array of characters - integ->additionalinfo = CreatePrimitiveInfo(4); - addr->additionalinfo = CreatePrimitiveInfo(8); - chara->additionalinfo = CreatePrimitiveInfo(1); + integ->additionalinfo = CreatePrimitiveInfo(SIZE_INT); + addr->additionalinfo = CreatePrimitiveInfo(SIZE_ADDR); + chara->additionalinfo = CreatePrimitiveInfo(SIZE_CHAR); stri->additionalinfo = CreateArrayInfo(1, chara); - boo->additionalinfo = CreatePrimitiveInfo(1); + boo->additionalinfo = CreatePrimitiveInfo(SIZE_BOOL); + + integ->tag = TYPE_PRIMITIVE; // explicitly set the type for integ + addr->tag = TYPE_PRIMITIVE; // explicitly set the type for addr + chara->tag = TYPE_PRIMITIVE; // explicitly set the type for chara + stri->tag = TYPE_ARRAY_TYPE; // explicitly set the type for stri + boo->tag = TYPE_PRIMITIVE; // explicitly set the type for boo // addr->additionalinfo = CreatePrimitiveInfo(8); start->Line_Number = 1; @@ -661,12 +674,33 @@ TableNode *populateTypeAndInfo(TableNode *tn, TableNode *type, AdInfo *info) { return tn; } +AdInfo *getAdInfo(TableNode *tn) { + if (tn == NULL) { + printdebug("passed a NULL table entry to getAdInfo. Invalid."); + return NULL; + } + if (tn == undefined) { + printdebug( + "passed an undefined table entry to getAdInfo. Invalid."); + return NULL; + } + if (tn->additionalinfo == NULL) { + printdebug( + "no additional info found in the table node. Invalid."); + return NULL; + } + return tn->additionalinfo; +} + +//simplified getAdInfoType int getAdInfoType(TableNode *tn) { if (tn == NULL) { printdebug( "passing in NULL table entry to getAdInfoType. Invalid"); return -1; } + return tn->tag; + /* if (tn == undefined) { printdebug("passing in undefined table entry to getAdInfoType. " "Invalid"); @@ -725,11 +759,10 @@ int getAdInfoType(TableNode *tn) { "passed in an entry that is not a primitive type, array, " "or record. Invalid."); return TYPE_FUNCTION_DECLARATION; - } + }*/ } -TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id, - AdInfo *ad) { +TableNode *CreateEntry(SymbolTable *table, int tag, TableNode *typeOf, char *id, AdInfo *ad) { if (table == NULL) { printdebug("Null reference to table"); @@ -752,7 +785,14 @@ TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id, return undefined; } + TableNode *newEntry = (TableNode *)calloc(1, sizeof(TableNode)); + if(tag<1 && tag>11){ + printdebug("Note- not passing in valid 'tag' identifier to create entry function. Setting tag to undefined"); + newEntry->tag = TYPE_UNDEFINED; + } else{ + newEntry->tag = tag; + } newEntry->theType = typeOf /*topDef*/; newEntry->theName = id; newEntry->additionalinfo = ad; @@ -769,6 +809,8 @@ TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id, } } + + TableNode *getTypeEntry(TableNode *tn) { if (tn == NULL) { printdebug("passed a NULL table entry to getType"); @@ -853,9 +895,9 @@ TableNode *addName(TableNode *tn, char *str) { return undefined; } if (tn->theName != NULL) { - printdebug( - "Name doesn't look like it is empty before you change. " - "Are you sure you need to update name?"); + //printdebug( + //"Name doesn't look like it is empty before you change. " + //"Are you sure you need to update name?"); if (str != NULL) { tn->theName = str; return tn; @@ -1011,178 +1053,177 @@ void print_symbol_table(SymbolTable *table, FILE *file_ptr) { } }*/ void print_symbol_table(SymbolTable *table, FILE *file_ptr) { + if (table == NULL) { + printdebug( + "%s[FATAL] passed in NULL table to print_symbol_table", + COLOR_RED); + return; + } - if (table == NULL) { - printdebug( - "%s[FATAL] passed in NULL table to print_symbol_table", - COLOR_RED); - return; - } + if (table->Parent_Scope == NULL) { + fprintf(file_ptr, "%-25s: %-6s : %-6s : %-25s: %-30s\n", "NAME", + "SCOPE", "PARENT", "TYPE", "Extra annotation"); + } - if (table->Parent_Scope == NULL) { - fprintf(file_ptr, "%-17s: %-6s : %-6s : %-21s: %-28s\n", "NAME", - "SCOPE", "PARENT", "TYPE", "Extra annotation"); - } + TableNode *entrie = table->entries; + fprintf(file_ptr, + "-------------------------:--------:--------:------------------" + "--------:------------------------------\n"); + int parant_scope = 0; + int current_scope = 0; + if (table->Parent_Scope != NULL) { + parant_scope = getParent(table)->Line_Number * 1000 + + getParent(table)->Column_Number; + current_scope = + table->Line_Number * 1000 + table->Column_Number; + } else { + current_scope = 1001; + } + if (entrie == NULL) { + fprintf(file_ptr, "%-25s: %06d : %06d : %-25s: %-30s\n", "", + current_scope, parant_scope, "", "Empty Scope"); + } + for (; entrie != NULL; entrie = getNextEntry(entrie)) { + if (getAdInfoType(entrie) == TYPE_ARRAY_TYPE) { + if (parant_scope == 0) { - TableNode *entrie = table->entries; - fprintf(file_ptr, "-----------------:--------:--------:----------------" - "------:---------" - "--------------------\n"); - int parant_scope = 0; - int current_scope = 0; - if (table->Parent_Scope != NULL) { - parant_scope = getParent(table)->Line_Number * 1000 + - getParent(table)->Column_Number; - current_scope = - table->Line_Number * 1000 + table->Column_Number; - } else { - current_scope = 1001; - } - if (entrie == NULL) { - fprintf(file_ptr, "%-17s: %06d : %06d : %-21s: %-28s\n", "", - current_scope, parant_scope, "", "Empty Scope"); - } - for (; entrie != NULL; entrie = getNextEntry(entrie)) { - if (getAdInfoType(entrie) == TYPE_ARRAY_TYPE) { - if (parant_scope == 0) { - - fprintf(file_ptr, - "%-17s: %06d : : %-21d -> " - "%-21s: %-28s\n", - entrie->theName, current_scope, - entrie->additionalinfo->ArrayAdInfo - ->numofdimensions, - entrie->additionalinfo->ArrayAdInfo - ->typeofarray->theName, - "Type of Array"); - } else { - fprintf(file_ptr, - "%-17s: %06d : %06d : %-21d -> %-21s: " - "%-28s\n", - entrie->theName, current_scope, - parant_scope, - entrie->additionalinfo->ArrayAdInfo - ->numofdimensions, - entrie->additionalinfo->ArrayAdInfo - ->typeofarray->theName, - "Type of Array"); - } - } - if (getAdInfoType(entrie) == TYPE_RECORD) { - if (parant_scope == 0) { - - fprintf(file_ptr, - "%-17s: %06d : :%-21s: " - "elements-%-28d\n", - entrie->theName, current_scope, - "record", - entrie->additionalinfo->RecAdInfo - ->numofelements); - } else { - fprintf(file_ptr, - "%-17s: %06d : %06d : %-21s: " - "elements-%-28d\n", - entrie->theName, current_scope, - parant_scope, "record", - entrie->additionalinfo->RecAdInfo - ->numofelements); - } - } - if (getAdInfoType(entrie) == TYPE_PRIMITIVE) { - if (parant_scope == 0) { - - fprintf( - file_ptr, - "%-17s: %06d : :%-21s: size-%-28d " - "bytes\n", - entrie->theName, current_scope, "Primitive", - entrie->additionalinfo->PrimAdInfo->size); - } else { - fprintf( - file_ptr, - "%-17s: %06d : %06d : %-21s: size-%-28d " - "bytes\n", + fprintf(file_ptr, + "%-25s: %06d : : %d -> %-20s: " + "%-30s\n", entrie->theName, current_scope, - parant_scope, "Primitive", - entrie->additionalinfo->PrimAdInfo->size); - } - } - if (getAdInfoType(entrie) == TYPE_FUNCTION_TYPE) { - if (parant_scope == 0) { + entrie->additionalinfo->ArrayAdInfo + ->numofdimensions, + entrie->additionalinfo->ArrayAdInfo + ->typeofarray->theName, + "Type of Array"); + } else { + fprintf(file_ptr, + "%-25s: %06d : : %d -> %-20s: " + "%-30s\n", + entrie->theName, current_scope, + parant_scope, + entrie->additionalinfo->ArrayAdInfo + ->numofdimensions, + entrie->additionalinfo->ArrayAdInfo + ->typeofarray->theName, + "Type of Array"); + } + } + if (getAdInfoType(entrie) == TYPE_RECORD) { + if (parant_scope == 0) { - fprintf(file_ptr, - "%-17s: %06d : : %-21s -> " - "%-21s: %-28s\n", - entrie->theName, current_scope, - entrie->additionalinfo->FunTypeAdInfo - ->parameter->theName, - entrie->additionalinfo->FunTypeAdInfo - ->returntype->theName, - "Type of Function"); - } else { - fprintf(file_ptr, - "%-17s: %06d : %06d : %-21s -> %-21s: " - "%-28s\n", - entrie->theName, current_scope, - parant_scope, - entrie->additionalinfo->FunTypeAdInfo - ->parameter->theName, - entrie->additionalinfo->FunTypeAdInfo - ->returntype->theName, - "Type of Function"); - } - } - if (getAdInfoType(entrie) == TYPE_FUNCTION_DECLARATION) { - if (parant_scope == 0) { + fprintf(file_ptr, + "%-25s: %06d : : %-25s: " + "elements-%-30d\n", + entrie->theName, current_scope, + "record", + entrie->additionalinfo->RecAdInfo + ->numofelements); + } else { + fprintf(file_ptr, + "%-25s: %06d : %06d : %-25s: " + "elements-%-30d\n", + entrie->theName, current_scope, + parant_scope, "record", + entrie->additionalinfo->RecAdInfo + ->numofelements); + } + } + if (getAdInfoType(entrie) == TYPE_PRIMITIVE) { + if (parant_scope == 0) { - fprintf(file_ptr, - "%-17s: %06d : :%-21s: %-28s\n", - entrie->theName, current_scope, - getType(entrie), "User Defined"); - } else { - fprintf(file_ptr, - "%-17s: %06d : %06d : %-21s: %-28s\n", - entrie->theName, current_scope, - parant_scope, getType(entrie), - "User Defined"); - } - } - if (getAdInfoType(entrie) == TYPE_UNDEFINED) { - if (parant_scope == 0) { + fprintf( + file_ptr, + "%-25s: %06d : : %-25s: size-%d " + "bytes\n", + entrie->theName, current_scope, "Primitive", + entrie->additionalinfo->PrimAdInfo->size); + } else { + fprintf( + file_ptr, + "%-25s: %06d : %06d : %-25s: size-%-30d " + "bytes\n", + entrie->theName, current_scope, + parant_scope, "Primitive", + entrie->additionalinfo->PrimAdInfo->size); + } + } + if (getAdInfoType(entrie) == TYPE_FUNCTION_TYPE) { + if (parant_scope == 0) { - fprintf(file_ptr, - "%-17s: %06d : :%-21s: %-28s\n", - entrie->theName, current_scope, - "undefined", "undefined entry"); - } else { - fprintf(file_ptr, - "%-17s: %06d : %06d : %-21s: %-28s\n", - entrie->theName, current_scope, - parant_scope, "undefined", - "undefined entry"); - } - } - } - if (getChildren(table) != NULL) { - ListOfTable *node = getChildren(table); - for (; node != NULL; node = node->next) { - if ((node->table) == NULL) { - print_symbol_table(node->table, file_ptr); - } else { - if ((node->table)->Line_Number == -1) { - continue; - } else { - print_symbol_table(node->table, - file_ptr); - } - } - } - } - if (getParent(table) == NULL) { - fprintf(file_ptr, "-----------------:--------:--------:--------" - "--------------:-------" - "----------------------\n"); - } + fprintf(file_ptr, + "%-25s: %06d : : %-25s -> " + "%-25s: %-30s\n", + entrie->theName, current_scope, + entrie->additionalinfo->FunTypeAdInfo + ->parameter->theName, + entrie->additionalinfo->FunTypeAdInfo + ->returntype->theName, + "Type of Function"); + } else { + fprintf(file_ptr, + "%-25s: %06d : %06d : %-25s -> %-21s: " + "%-30s\n", + entrie->theName, current_scope, + parant_scope, + entrie->additionalinfo->FunTypeAdInfo + ->parameter->theName, + entrie->additionalinfo->FunTypeAdInfo + ->returntype->theName, + "Type of Function"); + } + } + if (getAdInfoType(entrie) == TYPE_FUNCTION_DECLARATION) { + if (parant_scope == 0) { + + fprintf(file_ptr, + "%-25s: %06d : : %-25s: %-30s\n", + entrie->theName, current_scope, + getType(entrie), "User Defined"); + } else { + fprintf(file_ptr, + "%-25s: %06d : %06d : %-25s: %-30s\n", + entrie->theName, current_scope, + parant_scope, getType(entrie), + "User Defined"); + } + } + if (getAdInfoType(entrie) == TYPE_UNDEFINED) { + if (parant_scope == 0) { + + fprintf(file_ptr, + "%-25s: %06d : : %-25s: %-30s\n", + entrie->theName, current_scope, + "undefined", "undefined entry"); + } else { + fprintf(file_ptr, + "%-25s: %06d : %06d : %-25s: %-30s\n", + entrie->theName, current_scope, + parant_scope, "undefined", + "undefined entry"); + } + } + } + if (getChildren(table) != NULL) { + ListOfTable *node = getChildren(table); + for (; node != NULL; node = node->next) { + if ((node->table) == NULL) { + print_symbol_table(node->table, file_ptr); + } else { + if ((node->table)->Line_Number == -1) { + continue; + } else { + print_symbol_table(node->table, + file_ptr); + } + } + } + } + if (getParent(table) == NULL) { + fprintf(file_ptr, + "-------------------------:--------:--------:----------" + "----------------:------------------------------\n"); + } } // get top most symbol table SymbolTable *getAncestor(SymbolTable *table) { diff --git a/src/symbol_table.h b/src/symbol_table.h index de37098..f223b8a 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -3,6 +3,12 @@ #include #include +#define SIZE_INT 4 +#define SIZE_ADDR 8 +#define SIZE_CHAR 1 +#define SIZE_BOOL 4 //TODO: Ask Carl what this size should be + + struct TableNode; typedef struct { @@ -58,9 +64,11 @@ typedef struct ListOfTable { struct ListOfTable *next; } ListOfTable; +//Table node to store typedef struct TableNode { // reference to the type entry that this is struct TableNode *theType; + int tag; char *theName; AdInfo *additionalinfo; struct TableNode *next; From a53a22530dc5e346afdc020ad9e7dbd95d085a3b Mon Sep 17 00:00:00 2001 From: Annie Date: Fri, 4 Apr 2025 20:29:41 -0400 Subject: [PATCH 08/10] added tests for sprint 2 and 3 --- .../sp2_invalid_multiple_params_no_as.alpha | 7 ++++ .../sprint3/test/sp3_and_or_type_check.alpha | 37 +++++++++++++++++++ .../sp3_integer_binary_op_typecheck.alpha | 25 +++++++++---- 3 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 tests/sprint2/test/sp2_invalid_multiple_params_no_as.alpha create mode 100644 tests/sprint3/test/sp3_and_or_type_check.alpha diff --git a/tests/sprint2/test/sp2_invalid_multiple_params_no_as.alpha b/tests/sprint2/test/sp2_invalid_multiple_params_no_as.alpha new file mode 100644 index 0000000..805fb6e --- /dev/null +++ b/tests/sprint2/test/sp2_invalid_multiple_params_no_as.alpha @@ -0,0 +1,7 @@ +type rec: [integer: x; integer: y] +type main: rec -> integer +function test: main + +test (arg, arg2) := { + return 0; +} \ No newline at end of file diff --git a/tests/sprint3/test/sp3_and_or_type_check.alpha b/tests/sprint3/test/sp3_and_or_type_check.alpha new file mode 100644 index 0000000..a6cf442 --- /dev/null +++ b/tests/sprint3/test/sp3_and_or_type_check.alpha @@ -0,0 +1,37 @@ +type rec: [integer: x; integer: y] +type main: rec -> integer +function test: main + +test (arg, arg2) := { + [integer:x; Boolean: b] + while (true) { + x := 0; + } + + while (7) { + x := 1; + } + + if (true) { + x := 1; + } else { + x := 0; + } + + if (x) { + x := 0; + } else { + x := 1; + } + + b := b | b; + b := b & b; + b := 1 | b; + b := b | 1; + b := b & 1; + b := 1 & b; + b := 1 = 1; + b := 1 = b; + + return 0; +} diff --git a/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha b/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha index 5b13147..d8670ff 100644 --- a/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha +++ b/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha @@ -1,9 +1,18 @@ -entry(arg) := { - [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1; character : a] - x := 3 + 2 * 8; - x := 3 - 2 / 8; - x := a * 2 % 8; - b2 := 3 * 2 % 8; - x := 3 % 2 * 8; - x := 3 + arr - 8; +type main: string -> integer +type rec: [integer: x; integer: y] +function entry: main + +entry (arg) := { + [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1; character : a; rec : r] + + x := 3 + 2 * 8; + x := 3 - 2 / 8; + x := a * 2 % 8; + b2 := 3 * 2 % 8; + x := 3 % 2 * 8; + x := 3 + arr - 8; + r.x; + a.x; + + return 0; } From a5e1acefde50d43f00c5170a936658a3aba69eb5 Mon Sep 17 00:00:00 2001 From: Annie Date: Fri, 4 Apr 2025 20:39:01 -0400 Subject: [PATCH 09/10] fixed sytnax errors in tests --- tests/sprint3/test/sp3_and_or_type_check.alpha | 6 +++--- tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/sprint3/test/sp3_and_or_type_check.alpha b/tests/sprint3/test/sp3_and_or_type_check.alpha index a6cf442..450aee0 100644 --- a/tests/sprint3/test/sp3_and_or_type_check.alpha +++ b/tests/sprint3/test/sp3_and_or_type_check.alpha @@ -2,7 +2,7 @@ type rec: [integer: x; integer: y] type main: rec -> integer function test: main -test (arg, arg2) := { +test (arg) := { [integer:x; Boolean: b] while (true) { x := 0; @@ -12,13 +12,13 @@ test (arg, arg2) := { x := 1; } - if (true) { + if (true) then { x := 1; } else { x := 0; } - if (x) { + if (x) then { x := 0; } else { x := 1; diff --git a/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha b/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha index d8670ff..8d8ad70 100644 --- a/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha +++ b/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha @@ -11,8 +11,8 @@ entry (arg) := { b2 := 3 * 2 % 8; x := 3 % 2 * 8; x := 3 + arr - 8; - r.x; - a.x; + x := r.x; + x := a.x; return 0; } From 6a6677ccb523cb391788ecb1dfc9aed8ea9b4012 Mon Sep 17 00:00:00 2001 From: Partho Date: Fri, 4 Apr 2025 21:12:11 -0400 Subject: [PATCH 10/10] checking diff --- src/grammar.y | 42 +++++++++++------------------------------- src/runner.c | 2 +- src/symbol_table.c | 2 +- 3 files changed, 13 insertions(+), 33 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index 119960a..1725d62 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -154,7 +154,7 @@ definition: { //We are scanning through the dblock scope to get the length of the dblock (num of elements) from getRecSize //and then putting it in the entry that we created above. - setRecSize(look_up(cur, $2), getRecSize(cur)); + setRecSize(look_up(getParent(cur), $2), getRecSize(cur)); cur = getParent(cur); } @@ -206,27 +206,7 @@ definition: CreateEntry(cur,type_of_param_type, type_of_param, $4, getAdInfo(type_of_param)); } R_PAREN ASSIGN sblock //leaving scope is being taken care of in sblock - - /* | ID - { - TableNode *node = table_lookup(getAncestor(cur), $1); - if (node == undefined) { - printdebug("null check"); - } - if (node == undefined) { - printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); - } else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION) { - printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column); - } else { - setStartLine(node, @1.first_line); - setAsKeyword(node, false); - } - cur = CreateScope(cur, 0, 0); - } L_PAREN ID { - printdebug("Currently see a function definition taking only one parameter (no as) of name %s and argument name %s", - $1,$4); - CreateEntry(cur, getParameter(table_lookup(getAncestor(cur), getType(table_lookup(getAncestor(cur), $1)))), $4, NULL); - }R_PAREN ASSIGN sblock */ + | ID { TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { @@ -394,7 +374,7 @@ id_or_types: ID { printdebug("string of id is %s in ID pattern of id_or_type rule.", $1); - $$ = look_up(cur, $1); + $$ = table_lookup(getAncestor(cur), $1); } | types @@ -428,11 +408,11 @@ simple_statement: { if(strcmp(getName($1), getName($3)) == 0) { printdebug("Passed standard type check; assignable = expression"); - } else if((strcmp(getName($1), "array") == 0) && (strcmp(getName($3), "address") == 0)) { + } else if((strcmp(getType($1), "array") == 0) && (strcmp(getName($3), "address") == 0)) { printdebug("%s[☺] Passed array type check; %s = %s", COLOR_GREEN, getName($1), getName($3)); - } else if((strcmp(getName($1), "record") == 0) && (strcmp(getName($3), "address") == 0)) { + } else if((strcmp(getType($1), "record") == 0) && (strcmp(getName($3), "address") == 0)) { printdebug("%s[☺] Passed address type check; %s = %s", COLOR_GREEN, getName($1), getName($3)); - } else if((strcmp(getName($1), "function type primitive") == 0) && (strcmp(getName($3), "address") == 0)) { + } else if((strcmp(getType($1), "function type primitive") == 0) && (strcmp(getName($3), "address") == 0)) { printdebug("%s[☺] Passed function type primitive type check; %s = %s", COLOR_GREEN, getName($1), getName($3)); // } else if () { @@ -613,7 +593,7 @@ expression: | assignable { printdebug("assignable expression. current type is %s",$1); - $$= getTypeEntry($1);//idk if this is correct + $$= getTypeEntry($1); } | L_PAREN expression R_PAREN @@ -648,7 +628,7 @@ assignable: } ablock { - int type = getAdInfoType(look_up(cur, getName($1))); + int type = getAdInfoType(look_up(getParent(cur), getName($1))); printdebug("%stype is %d", COLOR_PURPLE, type); printdebug("%s", $1); @@ -658,7 +638,7 @@ assignable: printdebug("as function"); //char *funtype = getType(look_up(cur, $1)); printdebug("%s", getType(look_up(cur, getName($1)))); - TableNode *param = getParameter(look_up(cur, getType(look_up(cur, getName($1))))); + TableNode *param = getParameter(look_up(getParent(cur), getName($1))); SymbolTable *recList = getRecList(param); TableNode *lastCheckedRef = getFirstEntry(recList); TableNode *lastCheckedAct = getFirstEntry(cur); @@ -669,7 +649,7 @@ assignable: //this isn't very efficient, but will hopefully work while (lastCheckedAct != NULL && lastCheckedRef != NULL) { - if (strcmp(getName(lastCheckedAct), getType(lastCheckedRef)) != 0) { + if (strcmp(getName(lastCheckedAct), getName(lastCheckedRef)) != 0) { printdebug("expected %s. expression in function call got %s. at line %d and column %d",getType(lastCheckedRef), getName(lastCheckedAct), @3.first_line, @3.first_column); printdebug("%d", strcmp(getName(lastCheckedAct), getName(lastCheckedRef))); } @@ -691,7 +671,7 @@ assignable: printdebug("expected %s expression in function call but got %s at line %d and column %d",expected, actual, @3.first_line, @3.first_column); } } - $$ = getReturn((look_up(cur, getType(look_up(cur, getName($1)))))); + $$ = getReturn((table_lookup(getAncestor(cur), getType($1)))); printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName($$), getName($1)); } else if (type == TYPE_ARRAY_TYPE) { diff --git a/src/runner.c b/src/runner.c index c6f94a3..b20f594 100644 --- a/src/runner.c +++ b/src/runner.c @@ -143,7 +143,7 @@ int run(FILE *alpha) { if (st_flag != NULL) { yyparse(); - print_symbol_table(getAncestor(cur), st_flag); + print_symbol_table(top, st_flag); fclose(st_flag); if (yyin != NULL) { fclose(yyin); diff --git a/src/symbol_table.c b/src/symbol_table.c index 2e1af13..08a0932 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -1330,7 +1330,7 @@ SymbolTable *getParent(SymbolTable *st) { if (st->Parent_Scope == NULL) { printdebug("passed a top level scope to getParent function. " "Invalid."); - return NULL; + return st; } return st->Parent_Scope; }