diff --git a/src/grammar.y b/src/grammar.y index fa74029..085afda 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -687,7 +687,8 @@ simple_statement: //updating context for reserve/release if(getAdInfoType((TableNode*)$1) == TYPE_ARRAY || getAdInfoType((TableNode*)$1) == TYPE_FUNCTION_DECLARATION){ PushContext(getTypeEntry((TableNode*)$1)); - printdebug("pushed %s to context stack in simple statement assignable rule\n",getName(getTypeEntry((TableNode*)$1))); + + printf("pushed %s to context stack in simple statement assignable rule\n",getName(getContextTypeEntry(context_head))); } S_Push(TrueList, S_Init(), 0); S_Push(FalseList, S_Init(), 0); @@ -1196,14 +1197,23 @@ expression: emit_reserve(node, tn_or_const(NODE,$2)); $$ = node; } - if(((getTypeEntry((TableNode*)$2)) == getArrType(getContextTypeEntry(context_head))) + else if(((getTypeEntry((TableNode*)$2)) == getArrType(getContextTypeEntry(context_head))) && (getAdInfoType(getContextTypeEntry(context_head)) == TYPE_ARRAY_TYPE)){ char* temp = temp_var_gen(); //does this have integer? TableNode* node = CreateEntry(cur,TYPE_ARRAY, getContextTypeEntry(context_head), temp, NULL); emit_reserve(node, tn_or_const(NODE,$2)); $$ = node; - }else{ + }else if(((getTypeEntry((TableNode*)$2)) == getArrType(getContextTypeEntry(context_head))) + && (getAdInfoType(getContextTypeEntry(context_head)) == TYPE_ARRAY_TYPE)){ + char* temp = temp_var_gen(); + //does this have integer? + TableNode* node = CreateEntry(cur,TYPE_ARRAY, getContextTypeEntry(context_head), temp, NULL); + emit_reserve(node, tn_or_const(NODE,$2)); + $$ = node; + }else{ + printf("%s on right %s on left\n",getType((TableNode*)$2),getName(getArrType(getContextTypeEntry(context_head)))); + printf("%s is the name of the left\n",getName(getContextTypeEntry(context_head))); $$ = undefined; } } @@ -1218,7 +1228,7 @@ expression: emit_release((TableNode*)$2); $$ = node; } - if(((getTypeEntry((TableNode*)$2)) == getArrType(getContextTypeEntry(context_head))) + else if(((getTypeEntry((TableNode*)$2)) == getArrType(getContextTypeEntry(context_head))) && (getAdInfoType(getContextTypeEntry(context_head)) == TYPE_ARRAY_TYPE)){ char* temp = temp_var_gen(); //does this have integer? diff --git a/src/symbol_table.c b/src/symbol_table.c index bdf0c08..a1f457f 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -283,7 +283,7 @@ TableNode *getContextTypeEntry(Context_stack *cs) { return undefined; } TableNode* tn = cs->typeToCompare; - return NULL; + return tn; } Constant_Stack *Pop() { if (head == NULL) { @@ -1056,31 +1056,31 @@ SymbolTable *init(SymbolTable *start) { chara = (TableNode *)calloc(1, sizeof(TableNode)); stri = (TableNode *)calloc(1, sizeof(TableNode)); boo = (TableNode *)calloc(1, sizeof(TableNode)); - TableNode *reservetype = (TableNode *)calloc(1, sizeof(TableNode)); - TableNode *reserve = (TableNode *)calloc(1, sizeof(TableNode)); - TableNode *releasetype = (TableNode *)calloc(1, sizeof(TableNode)); - TableNode *release = (TableNode *)calloc(1, sizeof(TableNode)); + //TableNode *reservetype = (TableNode *)calloc(1, sizeof(TableNode)); + //TableNode *reserve = (TableNode *)calloc(1, sizeof(TableNode)); + //TableNode *releasetype = (TableNode *)calloc(1, sizeof(TableNode)); + //TableNode *release = (TableNode *)calloc(1, sizeof(TableNode)); // TableNode* arr = (TableNode*)malloc(sizeof(SymbolTable)); start->entries = integ; integ->next = addr; addr->next = chara; chara->next = stri; stri->next = boo; - boo->next = reservetype; - reservetype->next = reserve; - reserve->next = releasetype; - releasetype->next = release; - release->next = NULL; + boo->next = NULL;//reservetype; + //reservetype->next = reserve; + //reserve->next = releasetype; + //releasetype->next = release; + //release->next = NULL; integ->theName = "integer"; addr->theName = "address"; chara->theName = "character"; boo->theName = "Boolean"; stri->theName = "string"; - reserve->theName = "reserve"; - reservetype->theName = "reserve type"; - releasetype->theName = "release type"; - release->theName = "release"; + //reserve->theName = "reserve"; + //reservetype->theName = "reserve type"; + //releasetype->theName = "release type"; + //release->theName = "release"; // arr->theName= "array" // root TableNode that all are pointing to but not in table @@ -1147,10 +1147,10 @@ SymbolTable *init(SymbolTable *start) { chara->theType = prime; stri->theType = arrayprim; boo->theType = prime; - reserve->theType = reservetype; - reservetype->theType = funtypeprime; - releasetype->theType = funtypeprime; - release->theType = releasetype; + //reserve->theType = reservetype; + //reservetype->theType = funtypeprime; + //releasetype->theType = funtypeprime; + //release->theType = releasetype; // arr->theType=arrayprim; @@ -1164,20 +1164,20 @@ SymbolTable *init(SymbolTable *start) { chara->additionalinfo = CreatePrimitiveInfo(SIZE_CHAR); stri->additionalinfo = CreateArrayInfo(1, chara); boo->additionalinfo = CreatePrimitiveInfo(SIZE_BOOL); - reserve->additionalinfo = CreateFunctionDeclarationInfo(0, false, NULL); - reservetype->additionalinfo = CreateFunctionTypeInfo(integ, addr); - releasetype->additionalinfo = CreateFunctionTypeInfo(addr, integ); - release->additionalinfo = CreateFunctionDeclarationInfo(0, false, NULL); + //reserve->additionalinfo = CreateFunctionDeclarationInfo(0, false, NULL); + //reservetype->additionalinfo = CreateFunctionTypeInfo(integ, addr); + //releasetype->additionalinfo = CreateFunctionTypeInfo(addr, integ); + //release->additionalinfo = CreateFunctionDeclarationInfo(0, false, NULL); integ->tag = TYPE_PRIMITIVE_TYPE; // explicitly set the type for integ addr->tag = TYPE_PRIMITIVE_TYPE; // explicitly set the type for addr chara->tag = TYPE_PRIMITIVE_TYPE; // explicitly set the type for chara stri->tag = TYPE_ARRAY_TYPE; // explicitly set the type for stri boo->tag = TYPE_PRIMITIVE_TYPE; // explicitly set the type for boo - reserve->tag = TYPE_FUNCTION_DECLARATION; - reservetype->tag = TYPE_FUNCTION_TYPE; - releasetype->tag = TYPE_FUNCTION_TYPE; - release->tag = TYPE_FUNCTION_DECLARATION; + //reserve->tag = TYPE_FUNCTION_DECLARATION; + //reservetype->tag = TYPE_FUNCTION_TYPE; + //releasetype->tag = TYPE_FUNCTION_TYPE; + //release->tag = TYPE_FUNCTION_DECLARATION; // addr->additionalinfo = CreatePrimitiveInfo(8); start->Line_Number = 1; diff --git a/tests/programs/array.alpha b/tests/programs/array.alpha index 9022f19..55841e9 100644 --- a/tests/programs/array.alpha +++ b/tests/programs/array.alpha @@ -1,5 +1,4 @@ -#include "std.alpha" - +#include "../../library/std.alpha" type main: string -> integer function entry: main