示例#1
0
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); 
  } 
}
示例#3
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);
	}
}