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

@ -1468,6 +1468,8 @@ assignable:
// getElementOffset(rec, ID)
// 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));
}
;

View File

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

View File

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

View File

@ -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;