ExpTy transExp(Absyn.RecordExp e) { Types.NAME name = (Types.NAME) env.tenv.get(e.typ); if (name != null) { Type actual = name.actual(); if (actual instanceof Types.RECORD) { Types.RECORD r = (Types.RECORD) actual; return new ExpTy(translate.RecordExp(transFields(e.pos, r, e.fields)), name); } error(e.pos, "record type required"); } else error(e.pos, "undeclared type: " + e.typ); return new ExpTy(translate.Error(), VOID); }
ExpTy transExp(Absyn.ArrayExp e) { Types.NAME name = (Types.NAME) env.tenv.get(e.typ); ExpTy size = transExp(e.size); ExpTy init = transExp(e.init); checkInt(size, e.size.pos); if (name != null) { Type actual = name.actual(); if (actual instanceof Types.ARRAY) { Types.ARRAY array = (Types.ARRAY) actual; if (!init.ty.coerceTo(array.element)) error(e.init.pos, "element type mismatch"); return new ExpTy(translate.ArrayExp(size.exp, init.exp), name); } else error(e.pos, "array type required"); } else error(e.pos, "undeclared type: " + e.typ); return new ExpTy(translate.Error(), VOID); }