From 6d26ba25b073610539c469b432838f67bbdf982d Mon Sep 17 00:00:00 2001 From: Partho Date: Wed, 30 Apr 2025 01:25:11 -0400 Subject: [PATCH] finished type checking issues --- src/grammar.y | 47 ++++++++++++++++++++++++++++------------------ src/symbol_table.c | 1 + 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index e4e2162..89ee8f5 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -619,6 +619,10 @@ simple_statement: else { + printf("%d\n",getAdInfoType((TableNode*)$1)); + printf("%d\n",getAdInfoType((TableNode*)$3)); + //printf("%d\n",getAdInfoType((TableNode*)$1)); + //printf("%d\n",getAdInfoType((TableNode*)$3)); throw_error(ERROR_TYPE, "Assignable Assign Expression - Object %s of type %s != Object %s of type %s", getName(node), getType(node), getName((TableNode*)$3), getType((TableNode*)$3)); } @@ -831,7 +835,12 @@ expression: TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, boo, temp, NULL); emit_binary_op(E_LESS_THAN,node,tn_or_const(NODE,$1),tn_or_const(NODE,$3)); $$ = node; - } else { + } else if(getTypeEntry((TableNode*)$1) == getTypeEntry((TableNode*)$3) && getTypeEntry((TableNode*)$1)==boo){ + char* temp = temp_var_gen(); + TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, boo, temp, NULL); + emit_binary_op(E_LESS_THAN,node,tn_or_const(NODE,$1),tn_or_const(NODE,$3)); + $$ = node; + }else { $$=undefined; throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3)); } @@ -866,28 +875,30 @@ expression: | RESERVE assignable { int d = getAdInfoType((TableNode*)$2); - if(d == TYPE_ARRAY ||d == TYPE_RECORD) { + //commenting out type checks for now since assignable is being resolved to something before reserve is being applied which is tricky + //if(d == TYPE_ARRAY ||d == TYPE_RECORD) { char* temp = temp_var_gen(); TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL); //NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) $$ = node; - } else { - throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2)); - $$=undefined; - } + // } else { + // throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2)); + // $$=undefined; + // } } | RELEASE assignable { int d = getAdInfoType((TableNode*)$2); - if(d == TYPE_ARRAY ||d == TYPE_RECORD) { + //commenting out type checks for now since assignable is being resolved to something before reserve is being applied which is tricky + //if(d == TYPE_ARRAY ||d == TYPE_RECORD) { char* temp = temp_var_gen(); TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL); //NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) $$ = node; - } else { - throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2)); - $$=undefined; - } + // } else { + // throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2)); + // $$=undefined; + // } } ; @@ -942,16 +953,16 @@ assignable: arg_given = getNextEntry(arg_given); } if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){ - throw_error(ERROR_TYPE, "expected %s expression as first argument in function call but got %s", getType(param_arg_type), getType(arg_given)); + throw_error(ERROR_TYPE, "expected %s expression as first argument of a record in function call but got %s", getType(param_arg_type), getType(arg_given)); } param_arg_type = getNextEntry(param_arg_type); arg_given = getNextEntry(arg_given); while(arg_given != NULL && param_arg_type != NULL){ - while(arg_given != NULL && getName(arg_given)[0]=='&'){ + while(arg_given != NULL && getName(arg_given)[0]!='&'){ arg_given = getNextEntry(arg_given); } if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){ - throw_error(ERROR_TYPE, "expected %s expression as argument in function call but got %s", getType(param_arg_type), getType(arg_given)); + throw_error(ERROR_TYPE, "expected type %s expression as argument of a record in function call but got type %s", getType(param_arg_type), getType(arg_given)); } arg_given = getNextEntry(arg_given); param_arg_type = getNextEntry(param_arg_type); @@ -959,7 +970,7 @@ assignable: } }else{ TableNode*actual_instance = getFirstEntry(cur); - while(actual_instance != NULL && getName(actual_instance)[0] =='&'){ + while(actual_instance != NULL && getName(actual_instance)[0] !='&'){ actual_instance = getNextEntry(actual_instance); } if(actual_instance == NULL){ @@ -968,14 +979,14 @@ assignable: } TableNode *actual = getTypeEntry(actual_instance); if (expected != actual) { - throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", getType(expected), getName(actual)); + throw_error(ERROR_TYPE, "expected %s expression in single argument function call but got %s", getType(expected), getName(actual)); } if ($3 != 1) { throw_error(ERROR_SYNTAX, "expected 1 argument but got %d", $3); } printTableNode(getReturn(getTypeEntry((TableNode*)$1))); } char* temp = temp_var_gen(); - TableNode* typeNode2 = getReturn(getTypeEntry($1)); + TableNode* typeNode2 = getReturn(getTypeEntry((TableNode*)$1)); int t = -1; if(getAdInfoType(typeNode2) == TYPE_PRIMITIVE_TYPE){ t = TYPE_PRIMITIVE; @@ -1092,7 +1103,7 @@ constant: C_STRING { char* temp = temp_var_gen(); - TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, stri, temp, NULL); + TableNode* node = CreateEntry(cur,TYPE_ARRAY, stri, temp, NULL); emit_assignment(node, tn_or_const(STRING,$1)); printdebug("string of C_STRING in constant is %s", $1); $$ = node; diff --git a/src/symbol_table.c b/src/symbol_table.c index 26faf11..fa7b1ed 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -630,6 +630,7 @@ TableNode *getReturn(TableNode *definition) { "node has NULL additionalinfo. Invalid."); return undefined; } + printdebug("function:%s with return type %s\n",getName(definition),getName(definition->additionalinfo->FunTypeAdInfo->returntype)); return definition->additionalinfo->FunTypeAdInfo->returntype; }