updated to change strings to nodes in most locations

This commit is contained in:
Partho
2025-04-04 20:24:05 -04:00
parent 5e749eb1ac
commit f6abbbd67f
3 changed files with 327 additions and 229 deletions

View File

@ -43,21 +43,23 @@
TableNode * tn;
%}
%locations
%union {
int integ;
char* words;
TableNode* tn;
void* tn;
}
%locations
%type <integ> idlist
%type <tn> assignable
%type <tn> expression
%type <tn> constant
%type <tn> id_or_types
%type <tn> types
%token <tn> ID 101
%type <integ> argument_list
%type <integ> ablock
%token <words> ID 101
%token <tn> T_INTEGER 201
%token <tn> T_ADDRESS 202
%token <tn> 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), $<words>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), $<words>1)))), $<words>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)) != $<integ>2) {
printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, $1)), $<integ>2, @2.first_line, @2.first_column);
if (getNumArrDim(look_up(getParent(cur), getName($1))) != $<integ>2) {
printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, getName($1))), $<integ>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);
}
;

View File

@ -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) {

View File

@ -3,6 +3,12 @@
#include <stdlib.h>
#include <string.h>
#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;