/*these are the intermediate code definitions*/ #ifndef INTCODE_H_ #define INTCODE_H_ #include "env.h" #include "list.h" #include "mem.h" typedef struct quadruple quadruple_t; typedef struct { enum {symbol, int_const, float_const, bool_const, code} type; union { list_entry_t *entry_ptr; int *int_const_ptr; double *double_const_ptr; int *bool_const_ptr; quadruple_t *instr_ptr; } addr; } intmdt_addr_t; typedef struct { list_head_t *truelist; list_head_t *falselist; quadruple_t *instr; //yes, I know this isn't on the homework. I'm using it anyway } boolean_list_t; struct quadruple { char *op; intmdt_addr_t *arg1; intmdt_addr_t *arg2; intmdt_addr_t *result; boolean_list_t *control; }; //use this to handle everything over expressions. That way, we can still use the book's grammar without //implementing bools typedef struct { union { quadruple_t *quad_ptr; boolean_list_t *bool_list_ptr; intmdt_addr_t *addr_ptr; } var; list_head_t *nextlist; enum {var_addr, arith_expr, bool_expr} type; } intmdt_var_t; #define MAXCODELEN 8192 typedef struct { quadruple_t code[MAXCODELEN]; unsigned int n; /* Number of instructions in code */ } intmdt_code_t; intmdt_code_t *code_list; intmdt_code_t *code_init(); void printCodeList(intmdt_code_t*); void printQuadruple(intmdt_code_t*,int); intmdt_addr_t *newtemp(env_t*); int getType(intmdt_addr_t*); intmdt_var_t *makeNum(void*); intmdt_var_t *makeReal(void*); intmdt_var_t *makeBool(void*, intmdt_code_t*); intmdt_var_t *makeOp(void*,void*,void*, intmdt_code_t*, env_t *); intmdt_var_t *makeRel(void*,char*,void*, intmdt_code_t*, env_t *); intmdt_var_t *getSymbol(void*,env_t*); intmdt_var_t *makeArrayAddr(void*, void*, intmdt_code_t*, env_t*); intmdt_var_t *assignValue(void*, void*, intmdt_code_t*, env_t*); intmdt_var_t *makeAssign(void*, intmdt_code_t*, env_t*); quadruple_t *gen(intmdt_code_t *, env_t *, char *, intmdt_addr_t *, intmdt_addr_t *, intmdt_addr_t *); quadruple_t *gen2(intmdt_code_t *,char*,intmdt_addr_t*,intmdt_addr_t*,intmdt_addr_t*); void printaddr2(intmdt_addr_t *addr, intmdt_code_t *cd_list); intmdt_addr_t *widen(intmdt_code_t *, env_t *, intmdt_addr_t *, id_type_t*); intmdt_addr_t *newtemp(env_t*); #endif