Example #1
0
 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);
 }
Example #2
0
 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);
 }