static struct IntAndTable interpExp(A_exp exp, Table_ t) { struct IntAndTable ret; assert (exp != NULL); if (exp->kind == A_idExp) { ret.i = lookup(t, exp->u.id); ret.t = t; return ret; } else if (exp->kind == A_numExp) { ret.i = exp->u.num; ret.t = t; return ret; } else if (exp->kind == A_opExp) { struct IntAndTable left_iat = interpExp(exp->u.op.left, t); struct IntAndTable right_iat = interpExp(exp->u.op.right, left_iat.t); ret.i = binop(left_iat.i, right_iat.i, exp->u.op.oper); ret.t = right_iat.t; return ret; } else { assert (exp->kind == A_eseqExp); t = interpStm(exp->u.eseq.stm, t); return interpExp(exp->u.eseq.exp, t); } }
struct ExpResl interpExp(A_exp e, Table t) { Table t1; struct ExpResl er1, er2; switch (e->kind) { case A_numExp: er1.i = e->u.num; er1.t = t; return er1; case A_idExp: er1.i = lookup(t, e->u.id); er1.t = t; return er1; case A_opExp: er1 = interpExp(e->u.op.left, t); er2 = interpExp(e->u.op.right, er1.t); switch (e->u.op.oper) { case A_plus: return (er2.i = er1.i + er2.i, er2); case A_minus: return (er2.i = er1.i - er2.i, er2); case A_times: return (er2.i = er1.i * er2.i, er2); case A_div: return (er2.i = er1.i / er2.i, er2); } case A_eseqExp: t1 = interpStm(e->u.eseq.stm, t); er1 = interpExp(e->u.eseq.exp, t1); return er1; } }
struct IntAndTable interpExp(A_exp exp, Table_ t) { struct IntAndTable int_and_table; if (exp->kind == A_idExp) { int_and_table.i = lookup(t, exp->u.id); int_and_table.t = t; } else if (exp->kind == A_numExp) { int_and_table.i = exp->u.num; int_and_table.t = t; } else if (exp->kind == A_opExp) { struct IntAndTable int_and_table0 = interpExp(exp->u.op.left, t); struct IntAndTable int_and_table1 = interpExp(exp->u.op.right, int_and_table0.t); switch (exp->u.op.oper) { case A_plus: int_and_table.i = int_and_table0.i + int_and_table1.i; break; case A_minus: int_and_table.i = int_and_table0.i - int_and_table1.i; break; case A_times: int_and_table.i = int_and_table0.i * int_and_table1.i; break; case A_div: int_and_table.i = int_and_table0.i / int_and_table1.i; break; } int_and_table.t = int_and_table1.t; } else { return interpExp(exp->u.eseq.exp, interpStm(exp->u.eseq.stm, t)); } return int_and_table; }
Table interpStm(A_stm s, Table t) { Table t1,t2; struct ExpResl er1; A_expList e1; switch (s->kind) { case A_compoundStm: t1 = interpStm(s->u.compound.stm1, t); t2 = interpStm(s->u.compound.stm2, t1); return t2; case A_assignStm: er1 = interpExp(s->u.assign.exp, t); t1 = update(er1.t, s->u.assign.id, er1.i); return t1; case A_printStm: e1 = s->u.print.exps; t1 = t; while (e1->kind == A_pairExpList) { er1 = interpExp(e1->u.pair.head, t1); printf("%d ", er1.i); t1 = er1.t; e1 = e1->u.pair.tail; } if (e1->kind == A_lastExpList) { er1 = interpExp(e1->u.last, t1); printf("%d ", er1.i); } return er1.t; } return 0; }
Table_ interpExpList(A_expList exps, Table_ t) { if (exps->kind == A_lastExpList) { return interpExp(exps->u.last, t).t; } else { return interpExpList(exps->u.pair.tail, interpExp(exps->u.pair.head, t).t); } }
struct IntAndTable interpExp(A_exp e, Table_ t){ struct IntAndTable itb; int le,ri; switch(e->kind){ case A_idExp: itb.i = lookup(t, e->u.id); itb.t = t; return itb; break; case A_numExp: itb.i = e->u.num; itb.t = t; return itb; break; case A_opExp: itb = interpExp(e->u.op.left, t); le = itb.i; itb = interpExp(e->u.op.right, itb.t); ri = itb.i; { switch(e->u.op.oper){ case A_plus: itb.i = le + ri; break; case A_minus: itb.i = le - ri; break; case A_times: itb.i = le * ri; break; case A_div: if(ri == 0){ printf("Div 0 error!"); exit(0); } itb.i = le / ri; break; } } return itb; break; case A_eseqExp: t = interpStm(e->u.eseq.stm, t); itb = interpExp(e->u.eseq.exp, t); return itb; break; default: break; } return itb; }
struct IntAndTable interpExps(A_expList el, Table_ t){ struct IntAndTable itb; if(el->kind == A_pairExpList){ itb = interpExp(el->u.pair.head, t); printf("%d ",itb.i); itb = interpExps(el->u.pair.tail, itb.t); return itb; } else{ itb = interpExp(el->u.last,t); printf("%d ",itb.i); return itb; } return itb; }
static struct IntAndTable interpExpList(A_expList expList, Table_ t) { /* expression list can only appear in print statement. Implement print here */ assert (expList != NULL); if (expList->kind == A_pairExpList) { struct IntAndTable iat = interpExp(expList->u.pair.head, t); printf("%d ", iat.i); return interpExpList(expList->u.pair.tail, iat.t); } else { struct IntAndTable iat = interpExp(expList->u.last, t); printf("%d ", iat.i); return iat; } }
Table_ interpStm(A_stm s,Table_ t){ Table_ tb_; struct IntAndTable itb; switch(s->kind){ case A_compoundStm: tb_ = interpStm(s->u.compound.stm1, t); tb_ = interpStm(s->u.compound.stm2, tb_); return tb_; break; case A_assignStm: itb = interpExp(s->u.assign.exp, t); tb_ = itb.t; tb_ = update(tb_, s->u.assign.id, itb.i); return tb_; break; case A_printStm: itb = interpExps(s->u.print.exps, t); printf("\n"); return itb.t; break; default: break; } return NULL; }
Table_ interpStm(A_stm s, Table_ t) { if (s->kind == A_compoundStm) { t = interpStm(s->u.compound.stm1, t); t = interpStm(s->u.compound.stm2, t); return t; } else if (s->kind == A_assignStm) { struct IntAndTable int_and_table = interpExp(s->u.assign.exp, t); return update(int_and_table.t, s->u.assign.id, int_and_table.i); } else { return interpExpList(s->u.print.exps, t); } }
static Table_ interpStm(A_stm stm, Table_ t) { if (stm == NULL) return NULL; if (stm->kind == A_compoundStm) return interpStm(stm->u.compound.stm2, interpStm(stm->u.compound.stm1, t)); else if (stm->kind == A_assignStm) return update(t, stm->u.assign.id, interpExp(stm->u.assign.exp, t).i); else { struct IntAndTable iat = interpExpList(stm->u.print.exps, t); //printf("%d", iat.i); printf("\n"); return iat.t; } }