From 8b177b2807c4b4c45cbfb3ddbe346e9fe19752eb Mon Sep 17 00:00:00 2001 From: Partho Date: Tue, 6 May 2025 04:38:35 -0400 Subject: [PATCH] tweaking statement options --- src/grammar.h | 4 +- src/grammar.y | 117 +++++++++++---------------------------------- src/runner.h | 2 + src/symbol_table.c | 31 ++++++++++++ src/symbol_table.h | 8 ++++ 5 files changed, 71 insertions(+), 91 deletions(-) diff --git a/src/grammar.h b/src/grammar.h index a4a9300..588ac23 100644 --- a/src/grammar.h +++ b/src/grammar.h @@ -11,8 +11,8 @@ extern bool tc_flag; extern bool entry_flag; extern void insert_code_line(char *error_message, int line_number); extern bool contains_errors; - - +extern int context; +extern TableNode* comparator; typedef enum { ERROR_RUNTIME = 1, ERROR_SYNTAX = 2, diff --git a/src/grammar.y b/src/grammar.y index 4129d38..14041ed 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -680,6 +680,14 @@ compound_statement: simple_statement: assignable{ + //updating context for reserve/release + if(getAdInfoType((TableNode*)$1) == TYPE_ARRAY){ + context = 1; + } + if(getAdInfoType((TableNode*)$1) == TYPE_RECORD){ + context = 2; + } + comparator = $1; S_Push(TrueList, S_Init(), 0); S_Push(FalseList, S_Init(), 0); } ASSIGN expression @@ -721,6 +729,8 @@ simple_statement: throw_error(ERROR_TYPE, "Assignable Assign Expression - Object %s of type %s != Object %s of type %s", getName(node), getType(node), getName((TableNode*)$4), getType((TableNode*)$4)); } $$ = undefined; + //resetting context + context = 0; } @@ -768,6 +778,7 @@ ablock: argument_list: expression{ TableNode * arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), arg_var_gen(), NULL); + //inside a scope of an array call if line number is -2 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)); @@ -793,6 +804,7 @@ argument_list: { TableNode* arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), arg_var_gen(), NULL); + //inside a scope of an array call if line number is -2 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)); @@ -1125,7 +1137,7 @@ expression: emit_reserve(node, tn_or_const(INTEGER, &v)); $$ = node; } - | RELEASE ID { + /*| 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.", @@ -1136,7 +1148,7 @@ expression: TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, integ, temp, NULL); //emit release needed here $$ = node; - } + }*/ | RESERVE ID { cur = CreateScope(cur, -2,-1); } ablock { @@ -1159,50 +1171,8 @@ expression: $$=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(traversecon = context; + if (context_head == NULL) { + context_head = cs; + cs->next = NULL; + } else { + cs->next = context_head; + context_head = cs; + } + return cs; +} + +int PopContext() { + if (context_head == NULL) { + printf("cannot pop from an empty stack. Invalid.\n"); + return -1; + } + Context_stack *cs = context_head; + context_head = context_head->next; + printf("Popped context off stack: number %d\n", cs->con); + return cs->con; +} + Constant_Stack *Pop() { if (head == NULL) { printf("cannot pop from an empty stack. Invalid.\n"); diff --git a/src/symbol_table.h b/src/symbol_table.h index 2a8abb5..48419d9 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -29,6 +29,11 @@ typedef struct Constant_Stack { bool isConst; } Constant_Stack; +typedef struct Context_stack { + int con; + struct Context_stack *next; +} Context_stack; + typedef struct { int size; } primitive_info; @@ -107,7 +112,9 @@ void printdebug_impl(char *file, int line, const char *format, ...); char *temp_var_gen(); char *arg_var_gen(); Constant_Stack *Push(TableNode *type, void *value, bool isConst); +Context_stack *PushContext(int context); Constant_Stack *Pop(); +int PopContext(); Constant_Stack *Print_Stack(); AdInfo *CreatePrimitiveInfo(int size); int getPrimSize(TableNode *definition); @@ -184,6 +191,7 @@ extern TableNode *recprime; extern TableNode *funtypeprime; extern TableNode *undefined; extern Constant_Stack *head; +extern Context_stack *context_head; extern char *COLOR_RED; extern char *COLOR_GREEN;