I added some changes to make offsets work

This commit is contained in:
Meyer Simon
2025-05-06 15:49:31 -04:00
parent a459cb1112
commit 88511ac0e6
4 changed files with 19 additions and 10 deletions

View File

@ -1466,8 +1466,10 @@ assignable:
TableNode* node = CreateEntry(cur,t, type, temp, NULL); TableNode* node = CreateEntry(cur,t, type, temp, NULL);
// getElementOffset(rec, ID) // getElementOffset(rec, ID)
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) // NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
//emit_field_access(char* node, char* record, $3) // 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; $$=node;
}else{ }else{
throw_error(ERROR_TYPE, "Invalid field access %s", $3); 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)); printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3));
} }
; ;

View File

@ -345,8 +345,12 @@ void emit_address_of(TableNode *x, TNodeOrConst *y) {
current->operand1 = 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(); 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) { 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), getName(i->result),
get_string(i->operand1)); get_string(i->operand1));
break; break;
case E_DEREF_RIGHT: case E_DEREF_RIGHT:
fprintf(out_file, fprintf(out_file,
"%4.d: %s = *%s\n", "%4.d: %s = *((char * )%s + %s)\n",
i->index, i->index,
getName(i->result), getName(i->result),
get_string(i->operand1)); get_string(i->operand1),
get_string(i->operand2)
);
break;
case E_DEREF_LEFT: case E_DEREF_LEFT:
fprintf(out_file, fprintf(out_file,
"%4.d: *%s = %s\n", "%4.d: *%s = %s\n",
i->index, i->index,
getName(i->result), getName(i->result),
get_string(i->operand1)); get_string(i->operand1));
break;
} }
emit_as_file(out_file, i->next); emit_as_file(out_file, i->next);

View File

@ -143,7 +143,7 @@ void emit_function_dec(TableNode * name);
void emit_return(TNodeOrConst *value); void emit_return(TNodeOrConst *value);
void emit_reserve(TableNode *result, TNodeOrConst *size); void emit_reserve(TableNode *result, TNodeOrConst *size);
void emit_release(TableNode *pointer); 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_array_access(Op op, TableNode *result, TNodeOrConst *array, TNodeOrConst *index);
void emit_bounds_check(TNodeOrConst *index, TNodeOrConst *arr); void emit_bounds_check(TNodeOrConst *index, TNodeOrConst *arr);
void emit_goto(int i); void emit_goto(int i);

View File

@ -161,6 +161,8 @@ ListOfTable *getRestOfChildren(ListOfTable *lt);
TableNode *getFirstEntry(SymbolTable *st); TableNode *getFirstEntry(SymbolTable *st);
TableNode *getNextEntry(TableNode *tn); TableNode *getNextEntry(TableNode *tn);
TableNode *printTableNode(TableNode *tn); TableNode *printTableNode(TableNode *tn);
int getElementOffset(TableNode *rec, char* id);
int getRecPosition(TableNode* rec, char* id);
extern int yylex(void); extern int yylex(void);
extern char *yytext; extern char *yytext;
@ -199,4 +201,4 @@ extern char *COLOR_YELLOW;
extern char *COLOR_LIGHTBLUE; extern char *COLOR_LIGHTBLUE;
extern char *COLOR_LIGHTPURPLE; extern char *COLOR_LIGHTPURPLE;
extern char *COLOR_LIGHTCYAN; extern char *COLOR_LIGHTCYAN;
extern char *COLOR_WHITE; extern char *COLOR_WHITE;