Merge pull request #68 from UB-CSE443/array_type_check

working on making sure arrays and reserve/release are working properly
This commit is contained in:
Moroseui
2025-05-05 03:58:15 -04:00
committed by GitHub
3 changed files with 216 additions and 27 deletions

View File

@ -752,6 +752,11 @@ ablock:
argument_list:
expression{
TableNode * arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), arg_var_gen(), NULL);
if(getLine(cur)==-2){
if(getTypeEntry(arg) != integ){
throw_error(ERROR_TYPE, "Argument %s of type %s is not of type integer for an array argument", getName(arg), getType(arg));
}
}
// ----------------------------------------------------------------------------
// this is emitting the param withthe wrong TableNode
// We need to fiture out how to get the right one.
@ -772,6 +777,11 @@ argument_list:
{
TableNode* arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), arg_var_gen(), NULL);
if(getLine(cur)==-2){
if(getTypeEntry(arg) != integ){
throw_error(ERROR_TYPE, "Argument %s of type %s is not of type integer for an array argument", getName(arg), getType(arg));
}
}
emit_parameter(tn_or_const(NODE,$1));
$$ = 1;
printdebug("[ARGUMENT_LIST] argument list is %d", $$);
@ -1094,10 +1104,21 @@ expression:
emit_reserve(node, tn_or_const(INTEGER, &v));
$$ = node;
}
| RELEASE ID {$$ = undefined; }
| RELEASE ID {
TableNode * n = look_up(cur, $2);
if(getAdInfoType(n) != TYPE_RECORD){
throw_error(ERROR_TYPE, "Invalid Release expression with object %s of type %s.",
getName((TableNode*)n), getType((TableNode*)n));
$$=undefined;
}
char* temp = temp_var_gen();
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, integ, temp, NULL);
//emit release needed here
$$ = node;
}
| RESERVE ID {
cur = CreateScope(cur, -1,-1);
} L_PAREN argument_list R_PAREN {
cur = CreateScope(cur, -2,-1);
} ablock {
char* temp = temp_var_gen();
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL);
int a = S_Size(S_Peek(stack)) + 1;
@ -1105,6 +1126,81 @@ expression:
S_Pop(stack);
emit_function_call(node, a, tn_or_const(NODE, $2));
$$ = node;
TableNode * n = look_up(cur, $2);
if(getAdInfoType(n) != TYPE_ARRAY){
throw_error(ERROR_TYPE, "Invalid Reserve expression with object %s of type %s.",
getName(n), getType(n));
$$=undefined;
}
//doing more complicated type checking in a block
if(getNumArrDim(getTypeEntry(n)) != $4){
throw_error(ERROR_SYNTAX, "expected %d dimensions for this array but got %d", getNumArrDim(getTypeEntry(n)), $4);
$$=undefined;
}
cur = getParent(cur);
/*TableNode * t = getFirstEntry(cur);
TableNode * n = look_up(cur, $2);
if(getAdInfoType(n) == TYPE_ARRAY){
int array_dims = getNumArrDim(getTypeEntry(n));
if ($5 != array_dims) {
throw_error(ERROR_SYNTAX, "expected %d dimensions for this array but got %d", array_dims, $5);
}else{
int traverse = 0;
while(t != NULL && t != undefined && getName(t)[0] != '&'){
t = getNextEntry(t);
}
if(getTypeEntry(t) != integ){
throw_error(ERROR_TYPE, "Arg for an array is not of type integer");
$$= undefined;
}else{
//seen first number
traverse++;
t = getNextEntry(t);
while(traverse<array_dims){
while(t !=NULL && t!=undefined && getName(t)[0]!='&'){
t = getNextEntry(t);
}
if(getTypeEntry(t) != integ){
throw_error(ERROR_TYPE, "Arg for an array is not of type integer");
$$= undefined;
break;
}
traverse++;
t = getNextEntry(t);
}
if(traverse != array_dims){
throw_error(ERROR_TYPE, "Invalid number of arguments for array %s. Expected %d but got %d", getName(n), array_dims, traverse);
$$= undefined;}
}
}
}
*/
}
| RELEASE ID {
cur = CreateScope(cur, -2,-1);
} ablock {
char* temp = temp_var_gen();
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, integ, temp, NULL);
int a = S_Size(S_Peek(stack)) + 1;
emit_push_all(S_Peek(stack));
S_Pop(stack);
emit_function_call(node, a, tn_or_const(NODE, $2));
$$ = node;
TableNode * n = look_up(cur, $2);
if(getAdInfoType(n) != TYPE_ARRAY){
throw_error(ERROR_TYPE, "Invalid Release expression with object %s of type %s.",
getName(n), getType(n));
$$=undefined;
}
//doing more complicated type checking in a block
if(getNumArrDim(getTypeEntry(n)) != $4){
throw_error(ERROR_SYNTAX, "expected %d dimensions for this array but got %d", getNumArrDim(getTypeEntry(n)), $4);
$$=undefined;
}
cur = getParent(cur);
/*
TableNode * t = getFirstEntry(cur);
TableNode * n = look_up(cur, $2);
@ -1113,41 +1209,37 @@ expression:
if ($5 != array_dims) {
throw_error(ERROR_SYNTAX, "expected %d dimensions for this array but got %d", array_dims, $5);
}else{
int traverse = 0;
while(t != NULL && t != undefined && getName(t)[0] != '&'){
t = getNextEntry(t);
}
if(getTypeEntry(t) != integ){
throw_error(ERROR_TYPE, "Arg for an array is not of type integer");
}
$$= undefined;
}else{
//seen first number
traverse++;
t = getNextEntry(t);
while(t != NULL && t != undefined && getName(t)[0] != '&'){
while(getTypeEntry(t) != integ)(arg_given != NULL && getName(arg_given)[0]!='&'){
arg_given = getNextEntry(arg_given);
while(traverse<array_dims){
while(t !=NULL && t!=undefined && getName(t)[0]!='&'){
t = getNextEntry(t);
}
if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){
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));
if(getTypeEntry(t) != integ){
throw_error(ERROR_TYPE, "Arg for an array is not of type integer");
$$= undefined;
break;
}
arg_given = getNextEntry(arg_given);
param_arg_type = getNextEntry(param_arg_type);
traverse++;
t = getNextEntry(t);
}
if(traverse != array_dims){
throw_error(ERROR_TYPE, "Invalid number of arguments for array %s. Expected %d but got %d", getName(n), array_dims, traverse);
$$= undefined;}
}
}
}
*/
}
| RELEASE ID L_PAREN argument_list R_PAREN
{
int d = getAdInfoType((TableNode*)$2);
//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;
// }
}
/*
| RELEASE assignable
{