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