diff --git a/src/grammar.y b/src/grammar.y index 104653f..a94f5dd 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -1466,8 +1466,10 @@ assignable: TableNode* node = CreateEntry(cur,t, type, temp, NULL); // getElementOffset(rec, ID) - //NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) - //emit_field_access(char* node, char* record, $3) + // NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) + // emit_field_access(char* node, char* record, $3) + int n = getElementOffset(getTypeEntry((TableNode*)$1), $3); + emit_field_access(node, tn_or_const(NODE, $1), n); $$=node; }else{ throw_error(ERROR_TYPE, "Invalid field access %s", $3); @@ -1475,8 +1477,6 @@ assignable: } printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3)); } - - ; diff --git a/src/intermediate_code.c b/src/intermediate_code.c index f6d4e9b..e8e065c 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -345,8 +345,12 @@ void emit_address_of(TableNode *x, TNodeOrConst *y) { current->operand1 = y; } -void emit_field_access(char *result, char *record, char *field) { +void emit_field_access(TableNode *result, TNodeOrConst *record, int offset){ emit_helper(); + current->opcode = E_DEREF_RIGHT; + current->result = result; + current->operand1 = record; + current->operand2 = tn_or_const(INTEGER, &offset); } void emit_array_access(Op op, TableNode *result, TNodeOrConst *array, TNodeOrConst *index) { @@ -587,19 +591,22 @@ void emit_as_file(FILE *out_file, Instruction *i) { getName(i->result), get_string(i->operand1)); break; - case E_DEREF_RIGHT: fprintf(out_file, - "%4.d: %s = *%s\n", + "%4.d: %s = *((char * )%s + %s)\n", i->index, getName(i->result), - get_string(i->operand1)); + get_string(i->operand1), + get_string(i->operand2) + ); + break; case E_DEREF_LEFT: fprintf(out_file, "%4.d: *%s = %s\n", i->index, getName(i->result), get_string(i->operand1)); + break; } emit_as_file(out_file, i->next); diff --git a/src/intermediate_code.h b/src/intermediate_code.h index 5f50828..87e3123 100644 --- a/src/intermediate_code.h +++ b/src/intermediate_code.h @@ -143,7 +143,7 @@ void emit_function_dec(TableNode * name); void emit_return(TNodeOrConst *value); void emit_reserve(TableNode *result, TNodeOrConst *size); void emit_release(TableNode *pointer); -void emit_field_access(char *result, char *record, char *field); +void emit_field_access(TableNode *result, TNodeOrConst *record, int offset); void emit_array_access(Op op, TableNode *result, TNodeOrConst *array, TNodeOrConst *index); void emit_bounds_check(TNodeOrConst *index, TNodeOrConst *arr); void emit_goto(int i); diff --git a/src/symbol_table.h b/src/symbol_table.h index 2a8abb5..5feb46c 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -161,6 +161,8 @@ ListOfTable *getRestOfChildren(ListOfTable *lt); TableNode *getFirstEntry(SymbolTable *st); TableNode *getNextEntry(TableNode *tn); TableNode *printTableNode(TableNode *tn); +int getElementOffset(TableNode *rec, char* id); +int getRecPosition(TableNode* rec, char* id); extern int yylex(void); extern char *yytext; @@ -199,4 +201,4 @@ extern char *COLOR_YELLOW; extern char *COLOR_LIGHTBLUE; extern char *COLOR_LIGHTPURPLE; extern char *COLOR_LIGHTCYAN; -extern char *COLOR_WHITE; \ No newline at end of file +extern char *COLOR_WHITE;