void test_maxargs_exp_op_nested(void** state) { A_stm stm = A_PrintStm(A_LastExpList(A_OpExp( A_OpExp( A_OpExp( A_EseqExp( A_PrintStm(A_PairExpList( A_NumExp(7), A_PairExpList( A_NumExp(8), A_LastExpList(A_NumExp(9)) ) )), A_NumExp(14) ), A_plus, A_NumExp(5) ), A_times, A_NumExp(19) ), A_minus, A_NumExp(42) ))); assert_int_equal(3, maxargs(stm)); }
A_stm prog1(void) { //return A_AssignStm("a", A_OpExp(A_NumExp(5),A_plus, A_NumExp(3))); return A_CompoundStm(A_AssignStm("a", A_OpExp(A_NumExp(5),A_plus, A_NumExp(3))), A_CompoundStm(A_AssignStm("b", A_EseqExp(A_PrintStm(A_PairExpList(A_IdExp("a"), A_LastExpList(A_OpExp(A_IdExp("a"), A_minus, A_NumExp(1))))), A_OpExp(A_NumExp(10), A_times, A_IdExp("a")))), A_PrintStm(A_LastExpList(A_IdExp("b"))))); }
A_stm prog(void) { // a = 5 + 3; b = (print(a, a-1), 10*a); print b; return A_CompoundStm(A_AssignStm("a", A_OpExp(A_NumExp(5), A_plus, A_NumExp(3))), A_CompoundStm(A_AssignStm("b", A_EseqExp(A_PrintStm(A_PairExpList(A_IdExp("a"), A_LastExpList(A_OpExp(A_IdExp("a"), A_minus, A_NumExp(1))))), A_OpExp(A_NumExp(10), A_times, A_IdExp("a")))), A_PrintStm(A_LastExpList(A_IdExp("b"))))); }
A_stm right_prog(void) { // a = 5 + 3; b = (print(a, a-1), 10*a); print b; // a = 5 + b; b = (print(a, a, a-1), 10*a); print b; // a = (a = a+b, a); A_stm stm1 = prog_prog(); return A_CompoundStm( stm1, A_AssignStm("a", A_EseqExp(A_AssignStm("a", A_OpExp(A_IdExp("a"), A_plus, A_IdExp("b"))), A_IdExp("a")))); }
static void test_maxargs_complex(void** state) { // maxargs(stm) works with an arbitrary complex statement A_stm stm = A_CompoundStm( A_AssignStm( "a", A_OpExp(A_NumExp(5), A_plus, A_NumExp(3)) ), A_CompoundStm( A_AssignStm("b", A_EseqExp( A_PrintStm(A_PairExpList( A_IdExp("a"), A_LastExpList( A_OpExp(A_IdExp("a"), A_minus, A_NumExp(1)) ) )), A_OpExp(A_NumExp(10), A_times, A_IdExp("a")) )), A_PrintStm(A_LastExpList(A_IdExp("b"))) ) ); assert_int_equal(2, maxargs(stm)); }
struct expty transExp_forExp(Tr_level level, S_table venv, S_table tenv, A_exp a, Temp_label breakk) { struct expty lo = transExp(level, venv, tenv, a->u.forr.lo, breakk); struct expty hi = transExp(level, venv, tenv, a->u.forr.hi, breakk); if (lo.ty->kind != Ty_int || hi.ty->kind != Ty_int) EM_error(a->u.forr.lo->pos, "lo or hi expr is not int"); /* * LET VAR i := lo * VAR lmt := hi * IN * IF lo < hi THEN * WHILE i <= lmt DO * (body; * i := i+1) */ A_pos pos1 = a->pos; A_pos pos2 = a->u.forr.body->pos; S_symbol var = a->u.forr.var; S_symbol lmt = S_Symbol("limit"); A_exp ebody = a->u.forr.body; A_exp transformed = A_LetExp(pos1, A_DecList(A_VarDec(pos1, var, S_Symbol("int"), a->u.forr.lo), A_DecList(A_VarDec(pos1, lmt, S_Symbol("int"), a->u.forr.hi), NULL)), A_IfExp(pos1, A_OpExp(pos1, A_ltOp, a->u.forr.lo, a->u.forr.hi), A_WhileExp(pos1, A_OpExp(pos1, A_leOp, A_VarExp(pos1, A_SimpleVar(pos1, var)), A_VarExp(pos1, A_SimpleVar(pos1, lmt))), A_SeqExp(pos2, A_ExpList(ebody, A_ExpList(A_OpExp(pos1, A_plusOp, A_VarExp(pos1, A_SimpleVar(pos1, var)), A_IntExp(pos1, 1)), A_ExpList(A_SeqExp(pos2, NULL), // return no value NULL))))), NULL) ); return transExp(level, venv, tenv, transformed, breakk); }
void test_maxargs_exp_op(void** state) { A_stm stm = A_PrintStm(A_LastExpList(A_OpExp( A_EseqExp( A_PrintStm(A_PairExpList( A_NumExp(8), A_LastExpList(A_NumExp(9)) )), A_NumExp(7) ), A_plus, A_NumExp(17) ))); assert_int_equal(2, maxargs(stm)); }