Example #1
0
File: slp.c Project: oyzh/tiger
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;
}
Example #2
0
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;
}
Example #3
0
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);
    }
}
Example #4
0
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);
  }
}
Example #5
0
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;
  }
}
Example #6
0
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;
	}
}
Example #7
0
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;
}
Example #8
0
File: slp.c Project: oyzh/tiger
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;
}
Example #9
0
void interp(A_stm stm)
{
  interpStm(stm, NULL);
}
Example #10
0
void interp(A_stm s) {
	Table t = 0;
	Table resl;
	resl = interpStm(s, t);
	printf("\n");
}
Example #11
0
File: slp.c Project: oyzh/tiger
void interp(A_stm s){
  Table_ t;
  t = NULL;
  interpStm(s,t);
}
Example #12
0
void interp(A_stm stm) {
    Table_ t = interpStm(stm, NULL);
    print_table(t);
}