Added most type checking. Entries seem printing mostly OK in table.

This commit is contained in:
Partho
2025-04-08 18:12:11 -04:00
parent a4dc3d90be
commit faf592a725
2 changed files with 127 additions and 41 deletions

View File

@ -127,15 +127,17 @@ definition:
printdebug("Currently see a record definition for %s", $2);
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("Created a new scope");
//if (look_up(cur, $2) == undefined) {
// 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(getParent(cur), $2), getRecSize(cur));
printdebug("Moving up a scope after seeing a record definition");
cur = getParent(cur);
}
@ -158,14 +160,15 @@ definition:
{
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("[TYPE CHECK] 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);
printdebug("[TYPE CHECK] 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);
printdebug("Created a new scope");
}
L_PAREN ID
{
@ -178,7 +181,7 @@ definition:
|| 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);
printdebug("[TYPE CHECK] 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);
@ -192,9 +195,9 @@ definition:
TableNode *node = table_lookup(getAncestor(cur), $1);
if (node == undefined) {
printdebug(" undefined nodedeclared at line %d, column %d", @1.first_line, @1.first_column);
printdebug(" [TYPE CHECK] undefined nodedeclared at line %d, column %d", @1.first_line, @1.first_column);
}else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION){
printdebug("not a valid function declaration at line %d, column %d", @1.first_line, @1.first_column);
printdebug("[TYPE CHECK] not a valid function declaration at line %d, column %d", @1.first_line, @1.first_column);
}
else {
printdebug("setting as keyword to true");
@ -202,11 +205,12 @@ definition:
setAsKeyword(node, true);
}
cur = CreateScope(cur, 0, 0);
printdebug("Created a new scope");
}AS L_PAREN {
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);
printdebug("[TYPE CHECK] 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){
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);
@ -220,7 +224,7 @@ definition:
|| 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));
printdebug("[TYPE CHECK] 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));
@ -241,13 +245,27 @@ definition:
function_declaration:
FUNCTION ID COLON ID
{
{
if(getAdInfoType(look_up(cur, $4))==TYPE_FUNCTION_TYPE){
CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $4), $2, CreateFunctionDeclarationInfo(-1, false));
}
else{
printdebug("[TYPE CHECK] function declaration of %s is not a valid function type at line %d, column %d", $2, @1.first_line, @1.first_column);
CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $4), $2, CreateFunctionDeclarationInfo(-1, false));
}
}
| EXTERNAL FUNCTION ID COLON ID
{
CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $5), $3, NULL);
{
if(getAdInfoType(look_up(cur, $5))==TYPE_FUNCTION_TYPE){
CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $5), $3, CreateFunctionDeclarationInfo(-1, false));
}
else{
printdebug("[TYPE CHECK] function declaration of %s is not a valid function type at line %d, column %d", $3, @1.first_line, @1.first_column);
CreateEntry(cur,TYPE_FUNCTION_DECLARATION, look_up(cur, $5), $3, CreateFunctionDeclarationInfo(-1, false));
}
}
;
@ -290,6 +308,7 @@ sblock:
{
if (getLine(cur) != 0) {
cur = CreateScope(cur,@1.first_line,@1.first_column);
printdebug("Created a new scope");
} else {
setLineNumber(cur, @1.first_line);
setColumnNumber(cur,@1.first_line);
@ -297,6 +316,7 @@ sblock:
}
statement_list
{
printdebug("Moving up a scope after seeing sblock");
cur = getParent(cur);
}
R_BRACE
@ -305,9 +325,11 @@ sblock:
{
if (getLine(cur) != 0) {
cur = CreateScope(cur,@1.first_line,@1.first_column);
printdebug("Created a new scope when seeing an L brace");
} else {
setLineNumber(cur, @1.first_line);
setColumnNumber(cur,@1.first_line);
printdebug("Did not create a new scope when saw L Brace, set line number to %d", @1.first_line);
}
}
dblock
@ -316,6 +338,7 @@ sblock:
}
statement_list
{
printdebug("Moving up a scope after seeing sblock with dblock");
cur = getParent(cur);
}
R_BRACE
@ -330,8 +353,10 @@ dblock:
if (getLine(cur) == 0) {
setLineNumber(cur, @1.first_line);
setColumnNumber(cur,@1.first_line);
printdebug("Did not create a new scope when saw dblock, set line number to %d instead", @1.first_line);
} else{
cur = CreateScope(cur,@1.first_line,@1.first_column); // <----- What is this?
printdebug("Created a new scope when seeing a dblock");
}
}
declaration_list R_BRACKET;
@ -349,7 +374,33 @@ declaration:
id_or_types COLON ID
{
printdebug("ID/TYPE: %s, ID: %s", getName((TableNode*)$1), $3) ;
CreateEntry(cur,getAdInfoType((TableNode*)$1),(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
int d = getAdInfoType((TableNode*)$1);
if(d == TYPE_UNDEFINED) {
printdebug("undefined type at line %d and column %d", @2.first_line, @2.first_column);
CreateEntry(cur,d,(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
}
else if(d == TYPE_FUNCTION_TYPE) {
printdebug("invalid (function) type passed in declaration list in dblock", @2.first_line, @2.first_column);
d = TYPE_FUNCTION_TYPE;
CreateEntry(cur,d,(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
}
else if(d == TYPE_ARRAY_TYPE){
printdebug("array variable at line %d and column %d", @2.first_line, @2.first_column);
d = TYPE_ARRAY;
CreateEntry(cur,d,(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
}
else if(d == TYPE_RECORD_TYPE){
printdebug("record variable at line %d and column %d", @2.first_line, @2.first_column);
d = TYPE_RECORD;
CreateEntry(cur,d,(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
}
else if(d == TYPE_PRIMITIVE){
printdebug("primitive variable at line %d and column %d", @2.first_line, @2.first_column);
CreateEntry(cur,d,(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
}else {
printdebug("other invalid type passed at %d and column %d", @2.first_line, @2.first_column);
CreateEntry(cur,d,(TableNode*)$1,$3,getAdInfo((TableNode*)$1));
}
}
;
@ -427,7 +478,7 @@ simple_statement:
// Type check fails:
if (!passCheck) {
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("%s[TYPE CHECK] %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, getType(left), getType(right), COLOR_WHITE);
printdebug(" - %sgetType for address: %s", COLOR_YELLOW, getType(left));
}
@ -495,7 +546,7 @@ expression:
$$=(TableNode*)$2;
} else {
$$=undefined;
printdebug("mismatch at line %d and column %d. Invalid type being negated is %s", @1.first_line,@1.first_column,getName((TableNode*)$2));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid type being negated is %s", @1.first_line,@1.first_column,getName((TableNode*)$2));
}
}
@ -505,7 +556,7 @@ expression:
if((TableNode*)$1 == (TableNode*)$3 && (TableNode*)$1 == integ) {
$$=(TableNode*)$1;
} else {
printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -516,7 +567,7 @@ expression:
if((TableNode*)$1 == (TableNode*)$3 && (TableNode*)$1 == integ) {
$$=(TableNode*)$1;
} else {
printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -527,7 +578,7 @@ expression:
if((TableNode*)$1 == (TableNode*)$3 && (TableNode*)$1 == integ) {
$$=(TableNode*)$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));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName($1),getName($3));
$$=undefined;
}
}
@ -538,7 +589,7 @@ expression:
if((strcmp(getName((TableNode*)$1),getName((TableNode*)$3))==0) && ((TableNode*)$1 == integ)) {
$$=(TableNode*)$1;
} else {
printdebug("mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -549,7 +600,7 @@ expression:
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,getName((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -560,7 +611,7 @@ expression:
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((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -571,7 +622,7 @@ expression:
if((strcmp(getName((TableNode*)$1),getName((TableNode*)$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((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -582,7 +633,7 @@ expression:
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,getName((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s.", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$=undefined;
}
}
@ -593,7 +644,7 @@ expression:
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,getName((TableNode*)$1),getName((TableNode*)$3));
printdebug("[TYPE CHECK] mismatch at line %d and column %d. Invalid types %s and %s", @2.first_line,@2.first_column,getName((TableNode*)$1),getName((TableNode*)$3));
$$ = undefined;
}
}
@ -601,7 +652,25 @@ expression:
| assignable
{
printdebug("assignable expression. current type is %s",getName((TableNode*)$1));
$$= getTypeEntry((TableNode*)$1);
if(getAdInfoType((TableNode*)$1) == TYPE_PRIMITIVE||
getAdInfoType((TableNode*)$1) == TYPE_ARRAY ||
getAdInfoType((TableNode*)$1) == TYPE_RECORD){
printdebug("assignable passing up to expression is primitive, array instance, or record instance. Passing up its type");
$$= getTypeEntry((TableNode*)$1);
}
else if(getAdInfoType((TableNode*)$1) == TYPE_ARRAY_TYPE||
getAdInfoType((TableNode*)$1) == TYPE_RECORD_TYPE||
getAdInfoType((TableNode*)$1) == TYPE_FUNCTION_TYPE||
getAdInfoType((TableNode*)$1) == TYPE_FUNCTION_DECLARATION){
printdebug("assignable passing up to expression is array type, record type, function type, or function declaration");
$$= ((TableNode*)$1);
}
else {
printdebug("[TYPE CHECK] assignable passing up an invalid type to expression");
$$= ((TableNode*)$1);
}
}
| L_PAREN expression R_PAREN
@ -612,7 +681,14 @@ expression:
| memOp assignable
{
$$ = addr;
int d = getAdInfoType((TableNode*)$2);
if(d == TYPE_ARRAY_TYPE || d == TYPE_ARRAY || d == TYPE_RECORD_TYPE || d == TYPE_RECORD) {
//printdebug("[TYPE CHECK] valid memOp expression");
$$ = addr;
} else {
printdebug("[TYPE CHECK] invalid memOp expression at line %d and column %d.", @2.first_line,@2.first_column,getName((TableNode*)$2));
$$=undefined;
}
}
;
@ -626,7 +702,7 @@ assignable:
ID
{
$$ = look_up(cur,$1);
printdebug("[ASSIGNABLE - RULE 1] assignable = type: %s | ID = %s", $$, $1);
printdebug("[ASSIGNABLE - RULE 1] assignable = type: %s | ID = %s", getName((TableNode*)$$), $1);
}
| assignable
@ -686,7 +762,7 @@ assignable:
}
}
$$ = getReturn((table_lookup(getAncestor(cur), getType((TableNode*)$1))));
printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName($$), getName((TableNode*)$1));
printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName((TableNode*)$$), getName((TableNode*)$1));
} else if (type == TYPE_ARRAY_TYPE) {
printdebug("%sEntering array call", COLOR_LIGHTGREEN);
@ -694,7 +770,7 @@ assignable:
printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, getName((TableNode*)$1))), $<integ>2, @2.first_line, @2.first_column);
}
$$ = getArrType(look_up(getParent(cur), getName((TableNode*)$1)));
printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName($$), getName((TableNode*)$1));
printdebug("[ASSIGNABLE - RULE 2] assignable = type: %s | name_func = %s", getName((TableNode*)$$), getName((TableNode*)$1));
}
cur = getParent(cur);
}
@ -702,6 +778,7 @@ assignable:
| assignable rec_op ID
{
if(undefined != table_lookup(getRecList(table_lookup(getAncestor(cur), getName((TableNode*)$1))), $3)) {
$$ = table_lookup(getRecList(table_lookup(getAncestor(cur), getName((TableNode*)$1))), $3);
}
printdebug("[ASSIGNABLE - RULE 3] assignable = type: %s | ID = %s", getName((TableNode*)($$)), $1);
@ -729,7 +806,7 @@ constant:
C_STRING
{
$$ = $1;
printdebug("string of C_STRING in constant is %s",$<words>1);
printdebug("string of C_STRING in constant is %s",getName((TableNode*)$1));
}
| C_INTEGER
@ -741,25 +818,25 @@ constant:
| C_NULL
{
$$ = $1;
printdebug("string of C_NULL in constant is %s",$<words>1);
printdebug("string of C_NULL in constant is %s",getName((TableNode*)$1));
}
| C_CHARACTER
{
$$ = $1;
printdebug("string of C_CHARACTER in constant is %s",$<words>1);
printdebug("string of C_CHARACTER in constant is %s",getName((TableNode*)$1));
}
| C_TRUE
{
$$ = $1;
printdebug("string of C_TRUE in constant is %s",$<words>1);
printdebug("string of C_TRUE in constant is %s",getName((TableNode*)$1));
}
| C_FALSE
{
$$ = $1;
printdebug("string of C_FALSE in constant is %s",$<words>1);
printdebug("string of C_FALSE in constant is %s",getName((TableNode*)$1));
}
;
@ -770,25 +847,25 @@ types:
T_INTEGER
{
$$ = $1;
printdebug("string of T_INTEGER in types is %s",$<words>1);
printdebug("string of T_INTEGER in types is %s",getName((TableNode*)$1));
}
| T_ADDRESS
{
$$ = $1;
printdebug("string of T_ADDRESS in types is %s",$<words>1);
printdebug("string of T_ADDRESS in types is %s",getName((TableNode*)$1));
}
| T_CHARACTER
{
$$ = $1;
printdebug("string of T_CHARACTER in types is %s",$<words>1);
printdebug("string of T_CHARACTER in types is %s",getName((TableNode*)$1));
}
| T_BOOLEAN
{
$$ = $1;
printdebug("string of T_BOOLEAN in types is %s",$<words>1);
printdebug("string of T_BOOLEAN in types is %s",getName((TableNode*)$1));
}
;

View File

@ -948,14 +948,23 @@ void print_symbol_table(SymbolTable *table, FILE *file_ptr) {
st_fprint(file_ptr, entry->theName, currentScopeNum, parentScopeNum, arrayType, " Type of Array");
}
}
if (getAdInfoType(entry) == TYPE_RECORD_TYPE) {
char *recordAdInfo = (char *)malloc(100);
sprintf(recordAdInfo, " elements-%d", entry->additionalinfo->RecAdInfo->numofelements);
if (parentScopeNum == 0) {
st_fprint(file_ptr, entry->theName, currentScopeNum, -100, "record type", recordAdInfo);
} else {
st_fprint(file_ptr, entry->theName, currentScopeNum, parentScopeNum, "record type", recordAdInfo);
}
}
if (getAdInfoType(entry) == TYPE_RECORD) {
char *recordAdInfo = (char *)malloc(100);
sprintf(recordAdInfo, " elements-%d", entry->additionalinfo->RecAdInfo->numofelements);
if (parentScopeNum == 0) {
st_fprint(file_ptr, entry->theName, currentScopeNum, -100, "record", recordAdInfo);
st_fprint(file_ptr, entry->theName, currentScopeNum, -100, "record instance", recordAdInfo);
} else {
st_fprint(file_ptr, entry->theName, currentScopeNum, parentScopeNum, "record", recordAdInfo);
st_fprint(file_ptr, entry->theName, currentScopeNum, parentScopeNum, "record instance", recordAdInfo);
}
}