I added some changes to make offsets work
This commit is contained in:
@ -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));
|
||||
}
|
||||
|
||||
|
||||
;
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user