static void pr_expList(FILE *out, A_expList v, int d) { indent(out, d); if (v) { fprintf(out, "expList(\n"); pr_exp(out, v->head, d + 1); fprintf(out, ",\n"); pr_expList(out, v->tail, d + 1); fprintf(out, ")"); } else fprintf(out, "expList()"); }
/* Print A_var types. Indent d spaces. */ void pr_exp(FILE *out, A_exp v, int d) { indent(out, d); switch (v->kind) { case A_varExp: fprintf(out, "varExp(\n"); pr_var(out, v->u.var, d+1); fprintf(out, "%s", ")"); break; case A_nilExp: fprintf(out, "nilExp()"); break; case A_intExp: fprintf(out, "intExp(%d)", v->u.intt); break; case A_stringExp: fprintf(out, "stringExp(%s)", v->u.stringg); break; case A_callExp: fprintf(out, "callExp(%s,\n", S_name(v->u.call.func)); pr_expList(out, v->u.call.args, d+1); fprintf(out, ")"); break; case A_opExp: fprintf(out, "opExp(\n"); indent(out, d+1); pr_oper(out, v->u.op.oper); fprintf(out, ",\n"); pr_exp(out, v->u.op.left, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.op.right, d+1); fprintf(out, ")"); break; case A_recordExp: fprintf(out, "recordExp(%s,\n", S_name(v->u.record.typ)); pr_efieldList(out, v->u.record.fields, d+1); fprintf(out, ")"); break; case A_seqExp: fprintf(out, "seqExp(\n"); pr_expList(out, v->u.seq, d+1); fprintf(out, ")"); break; case A_assignExp: fprintf(out, "assignExp(\n"); pr_var(out, v->u.assign.var, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.assign.exp, d+1); fprintf(out, ")"); break; case A_ifExp: fprintf(out, "iffExp(\n"); pr_exp(out, v->u.iff.test, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.iff.then, d+1); if (v->u.iff.elsee) { /* else is optional */ fprintf(out, ",\n"); pr_exp(out, v->u.iff.elsee, d+1); } fprintf(out, ")"); break; case A_whileExp: fprintf(out, "whileExp(\n"); pr_exp(out, v->u.whilee.test, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.whilee.body, d+1); fprintf(out, ")\n"); break; case A_forExp: fprintf(out, "forExp(%s,\n", S_name(v->u.forr.var)); pr_exp(out, v->u.forr.lo, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.forr.hi, d+1); fprintf(out, "%s\n", ","); pr_exp(out, v->u.forr.body, d+1); fprintf(out, ",\n"); indent(out, d+1); fprintf(out, "%s", v->u.forr.escape ? "TRUE)" : "FALSE)"); break; case A_breakExp: fprintf(out, "breakExp()"); break; case A_letExp: fprintf(out, "letExp(\n"); pr_decList(out, v->u.let.decs, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.let.body, d+1); fprintf(out, ")"); break; case A_arrayExp: fprintf(out, "arrayExp(%s,\n", S_name(v->u.array.typ)); pr_exp(out, v->u.array.size, d+1); fprintf(out, ",\n"); pr_exp(out, v->u.array.init, d+1); fprintf(out, ")"); break; default: assert(0); } }
/* Print A_var types. Indent d spaces. */ void pr_exp(FILE *out, A_exp e, int d) { indent(out, d); switch (e->kind) { case A_varExp: fprintf(out, "varExp(\n"); pr_var(out, e->u.var, d + 1); fprintf(out, "%s", ")"); break; case A_nilExp: fprintf(out, "nilExp()"); break; case A_intExp: fprintf(out, "intExp(%d)", e->u.int_); break; case A_stringExp: fprintf(out, "stringExp(%s)", e->u.string_); break; case A_callExp: fprintf(out, "callExp(%s,\n", S_name(e->u.call.func)); pr_expList(out, e->u.call.args, d + 1); fprintf(out, ")"); break; case A_opExp: fprintf(out, "opExp(\n"); indent(out, d + 1); pr_binop(out, e->u.op.op); fprintf(out, ",\n"); pr_exp(out, e->u.op.exp1, d + 1); fprintf(out, ",\n"); pr_exp(out, e->u.op.exp2, d + 1); fprintf(out, ")"); break; case A_recordExp: fprintf(out, "recordExp(%s,\n", S_name(e->u.record.type)); pr_assignfieldList(out, e->u.record.assignfieldList, d + 1); fprintf(out, ")"); break; case A_seqExp: fprintf(out, "seqExp(\n"); pr_expList(out, e->u.seq, d + 1); fprintf(out, ")"); break; case A_assignExp: fprintf(out, "assignExp(\n"); pr_var(out, e->u.assign.var, d + 1); fprintf(out, ",\n"); pr_exp(out, e->u.assign.exp, d + 1); fprintf(out, ")"); break; case A_ifExp: fprintf(out, "ifExp(\n"); pr_exp(out, e->u.if_.exp1, d + 1); fprintf(out, ",\n"); pr_exp(out, e->u.if_.exp2, d + 1); if (e->u.if_.exp3) { /* else is optional */ fprintf(out, ",\n"); pr_exp(out, e->u.if_.exp3, d + 1); } fprintf(out, ")"); break; case A_whileExp: fprintf(out, "whileExp(\n"); pr_exp(out, e->u.while_.exp1, d + 1); fprintf(out, ",\n"); pr_exp(out, e->u.while_.exp2, d + 1); fprintf(out, ")\n"); break; case A_forExp: fprintf(out, "forExp(%s,\n", S_name(e->u.for_.id)); pr_exp(out, e->u.for_.exp1, d + 1); fprintf(out, ",\n"); pr_exp(out, e->u.for_.exp2, d + 1); fprintf(out, "%s\n", ","); pr_exp(out, e->u.for_.exp3, d + 1); fprintf(out, ",\n"); indent(out, d + 1); //fprintf(out, "%s", e->u.for_.escape ? "TRUE)" : "FALSE)"); break; case A_breakExp: fprintf(out, "breakExp()"); break; case A_letExp: fprintf(out, "letExp(\n"); pr_decList(out, e->u.let.decList, d + 1); fprintf(out, ",\n"); pr_expList(out, e->u.let.expList, d + 1); fprintf(out, ")"); break; case A_arrayExp: fprintf(out, "arrayExp(%s,\n", S_name(e->u.array.type)); pr_exp(out, e->u.array.exp1, d + 1); fprintf(out, ",\n"); pr_exp(out, e->u.array.exp2, d + 1); fprintf(out, ")"); break; default: assert(0); } }