From d0d38b38e93261df565edef504a0acd9137bdd99 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Sun, 27 Apr 2025 20:12:17 -0400 Subject: [PATCH] NOTHING MATTERS ANYMORE WOOOOO --- src/codegen.c | 1 - src/grammar.y | 100 ++++++++++++++++++++++++++++---------------------- src/runner.c | 11 ++++-- 3 files changed, 63 insertions(+), 49 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 250d2a4..8e63df4 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -493,7 +493,6 @@ int generateAssign(Instruction *inst) { CGNode *op1CG = findCG(getTN(op1)); if (op1CG == NULL) { - printf("failed here\n"); printdebug("generateAssign failed, op1 is not constant but not in CGlist"); return -1; } diff --git a/src/grammar.y b/src/grammar.y index 7060c94..4ba8a08 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -564,23 +564,36 @@ simple_statement: assignable ASSIGN expression { printdebug("simple statement"); TableNode* node; - if((getAdInfoType((TableNode*)$1) == TYPE_FUNCTION_DECLARATION)|| - (getAdInfoType((TableNode*)$1) == TYPE_ARRAY)|| - (getAdInfoType((TableNode*)$1) == TYPE_RECORD)|| - (getAdInfoType((TableNode*)$1) == TYPE_PRIMITIVE)){ + if((getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_FUNCTION_DECLARATION)|| + (getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_ARRAY)|| + (getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_RECORD)|| + (getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_PRIMITIVE)){ - node = ((TableNode*)$1); - } else{ - printdebug("Invalid type passed to assignable."); - node = undefined; - } + node = ((TableNode*)$1); + } else { + printf("%d\n",getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1)))); + throw_error(ERROR_TYPE, "Invalid type passed to assignable."); + printf("%d, %d\n", @1.first_line, @1.first_column); + printf("%s\n", getType(getTypeEntry((TableNode*)$1))); + printf("%s\n\n", getType(getTypeEntry((TableNode*)$3))); + node = undefined; + } if(getAdInfoType(node) == getAdInfoType((TableNode*)$3)){ emit_assignment($1, tn_or_const(NODE, $3)); - printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getName(node), getName((TableNode*)$3)); - } else { - throw_error(ERROR_TYPE, "%s != %s", getName(node), getName((TableNode*)$3)); + printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getType(node), getType((TableNode*)$3)); + } else if (getTypeEntry(getTypeEntry(node)) == arrayprim && getTypeEntry((TableNode*)$3) == addr) { + emit_assignment($1, tn_or_const(NODE, $3)); + printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getType(node), getType((TableNode*)$3)); + } else if (getTypeEntry(getTypeEntry(node)) == recprime && getTypeEntry((TableNode*)$3) == addr) { + emit_assignment($1, tn_or_const(NODE, $3)); + printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getType(node), getType((TableNode*)$3)); + } + + + else { + throw_error(ERROR_TYPE, "Object %s of type %s != Object %s of type %s", getName(node), getType(node), getName((TableNode*)$3), getType((TableNode*)$3)); } $$ = undefined; @@ -620,14 +633,14 @@ argument_list: //NEED TO EMIT PARAMETERS HERE. MAYBE USE STACK STRUCTURE expression COMMA argument_list { - CreateEntry(cur,getAdInfoType((TableNode*)$1), (TableNode*)$1, getName((TableNode*)$1), NULL); + CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), getName((TableNode*)$1), NULL); $$ = $3 + 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } | expression { - CreateEntry(cur,getAdInfoType((TableNode*)$1),(TableNode*)$1, getName((TableNode*)$1), NULL); + CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), getName((TableNode*)$1), NULL); $$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$); } @@ -656,7 +669,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName(getTypeEntry((TableNode*)$2)), getName(integ)); + throw_error(ERROR_TYPE, "Object %s of type %s is not of type integer and can't be negated", getName((TableNode*)$2), getType((TableNode*)$2)); } } @@ -672,7 +685,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$2), getName(boo)); + throw_error(ERROR_TYPE, "Object %s of type %s is not of type Boolean and can't be negated", getName((TableNode*)$2), getType((TableNode*)$2)); } } @@ -687,6 +700,7 @@ expression: } else { $$=undefined; throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + 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)); } } @@ -701,7 +715,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + 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)); } } @@ -715,7 +729,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + 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)); } } @@ -729,7 +743,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + 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)); } } @@ -743,7 +757,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + 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)); } } @@ -757,7 +771,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be Boolean", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3)); } } @@ -771,7 +785,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be Boolean", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3)); } } @@ -785,7 +799,7 @@ expression: $$ = node; } else { $$=undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + 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)); } } @@ -800,7 +814,7 @@ expression: } else { $$ = undefined; - throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3)); + throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be the same type", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3)); } } @@ -824,7 +838,7 @@ expression: //NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) $$ = node; } else { - throw_error(ERROR_TYPE, "Invalid memOp expression (%s).", getName((TableNode*)$2)); + throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2)); $$=undefined; } } @@ -884,13 +898,12 @@ assignable: } if ($3 != getRecLength(param)) { - printdebug("expected %d arguments but got %d", getRecLength(param), $3); + throw_error(ERROR_SYNTAX, "expected %d arguments but got %d", getRecLength(param), $3); } //this isn't very efficient, but will hopefully work while (lastCheckedAct != NULL && lastCheckedRef != NULL) { if (getTypeEntry(lastCheckedRef) != getTypeEntry(lastCheckedAct)) { - 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); - + throw_error(ERROR_TYPE, "expected %s. expression in function call got %s",getType(lastCheckedRef), getName(lastCheckedAct)); } lastCheckedAct = getNextEntry(lastCheckedAct); TableNode *tn = getFirstEntry(recList); @@ -904,25 +917,24 @@ assignable: } } else { if (strcmp(getName(param), getName(getFirstEntry(cur))) != 0) { - printdebug("expected %s expression in function call but got %s", getName(param), getName(getFirstEntry(cur))); + throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", getName(param), getName(getFirstEntry(cur))); } if (getNextEntry(getFirstEntry(cur)) != NULL) { - printdebug("expected 1 parameter, but got multiple in function call"); + throw_error(ERROR_SYNTAX, "expected 1 parameter, but got multiple in function call"); } } } else { char *expected = getName(getParameter(look_up(getParent(cur), getType((TableNode*)$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); + throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", expected, actual); } if ($3 != 1) { - printdebug("expected 1 argument but got %d", $3); - } + 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)); int t = -1; @@ -939,7 +951,7 @@ assignable: t = TYPE_FUNCTION_DECLARATION; }else{ t= TYPE_UNDEFINED; - printdebug("CHANGE ME [TYPE CHECK] Undefined type stored in record. improper."); + throw_error(ERROR_TYPE, "Undefined type returned by function."); } TableNode* node = CreateEntry(cur,t, typeNode2, temp, NULL); $$ = node; @@ -949,7 +961,7 @@ assignable: } else if (type == TYPE_ARRAY_TYPE) { printdebug("%sEntering array call", COLOR_LIGHTGREEN); if (getNumArrDim(look_up(getParent(cur), getType((TableNode*)$1))) != $2) { - printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, getName((TableNode*)$1))), $2, @2.first_line, @2.first_column); + throw_error(ERROR_SYNTAX, "expected %d arguments for this array but got %d", getNumArrDim(look_up(cur, getName((TableNode*)$1))), $2); } char* temp = temp_var_gen(); @@ -968,7 +980,7 @@ assignable: t = TYPE_FUNCTION_DECLARATION; }else{ t= TYPE_UNDEFINED; - printdebug("CHANGE ME [TYPE CHECK] Undefined type stored in record. improper."); + throw_error(ERROR_TYPE, "Undefined type stored in array."); } TableNode* node = CreateEntry(cur,t, typeNode2, temp, NULL); //emit assign here @@ -981,8 +993,8 @@ assignable: | assignable rec_op ID { - if(getAdInfoType((TableNode*)$1) != TYPE_RECORD_TYPE){ - printdebug("CHANGE ME [TYPE CHECK]Invalid type passed to record access"); + if(getAdInfoType((TableNode*)$1) != TYPE_RECORD){ + throw_error(ERROR_TYPE, "Invalid type passed to record access"); } else if(undefined != table_lookup(getRecList(table_lookup(getAncestor(cur), getName(getTypeEntry((TableNode*)$1)))), $3)) { @@ -1002,7 +1014,7 @@ assignable: t = TYPE_FUNCTION_DECLARATION; }else{ t= TYPE_UNDEFINED; - printdebug("CHANGE ME [TYPE CHECK] Undefined type stored in record. improper."); + throw_error(ERROR_TYPE, "Undefined type stored in record."); } TableNode* node = CreateEntry(cur,t, type, temp, NULL); @@ -1010,7 +1022,7 @@ assignable: //emit_field_access(char* node, char* record, $3) $$=node; }else{ - printdebug("CHANGE ME [TYPE CHECK] undefined type (Field Access Lookup failed)"); + throw_error(ERROR_TYPE, "Invalid field access %s", $3); $$=undefined; } printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3)); @@ -1186,7 +1198,7 @@ void throw_error(ErrorType error_type, const char *format, ...) { return; } - snprintf(total_error_message, total_needed, "%s%s\n\n", error_message, error_message2); + snprintf(total_error_message, total_needed, "%s%s\n", error_message, error_message2); if (tc_flag) { insert_code_line(total_error_message, line); } else { @@ -1208,9 +1220,9 @@ void yyerror(const char *err) { // Grammar Fallback Case if (strcmp(err, "syntax error") == 0) { if (asc_flag != NULL) { - int needed = snprintf(NULL, 0, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n\n", line, column, yytext); + int needed = snprintf(NULL, 0, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n", line, column, yytext); char *error_message = malloc(needed + 1); - snprintf(error_message, needed + 1, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n\n", line, column, yytext); + snprintf(error_message, needed + 1, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n", line, column, yytext); insert_code_line(error_message, line); } else { diff --git a/src/runner.c b/src/runner.c index a74c424..8d5feac 100644 --- a/src/runner.c +++ b/src/runner.c @@ -247,7 +247,7 @@ int is_alpha_file(char *alpha, int file_len) { return 0; // is alpha file } -void insert_code_line(char * error_message, int line_number) { +void insert_code_line(char *error_message, int line_number) { CodeLine *error_line = malloc(sizeof(CodeLine)); error_line->line_number = line_number; error_line->line = malloc(strlen(error_message) + 1); @@ -259,11 +259,14 @@ void insert_code_line(char * error_message, int line_number) { int line = error_line->line_number; CodeLine *current = code_head; + while (current != NULL) { if (current->line_number == line) { - CodeLine *next_code_line = current->next; - current->next = error_line; - error_line->next = next_code_line; + if (current->is_error == false) { + CodeLine *next_code_line = current->next; + current->next = error_line; + error_line->next = next_code_line; + } } current = current->next; }