Advertisement
YoungOldBoyMan

TypeChecker

Apr 24th, 2023 (edited)
1,562
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.85 KB | None | 0 0
  1.     case BlockExp(vals, vars, defs, classes, exps) =>
  2.       var tenv1 = tenv
  3.       var ctenv1 = ctenv
  4.       for (v <- vals) {
  5.         val t = typeCheck(v.exp, tenv1, ctenv1)
  6.         val ot = getType(v.opttype, ctenv1)
  7.         checkTypesEqual(t, ot, v)
  8.         tenv1 = tenv1 + (v.x -> ot.getOrElse(t))
  9.       }
  10.       for (va <- vars) {
  11.         val t = typeCheck(va.exp, tenv1, ctenv1)
  12.         val ot = getType(va.opttype, ctenv1)
  13.         checkTypesEqual(t, ot, va)
  14.         tenv1 = tenv1 + (va.x -> MutableType(ot.getOrElse(t)))
  15.       }
  16.       for (d <- defs) {
  17.         d match {
  18.           case DefDecl(fun, params, optrestype, body) =>
  19.             val funtype = makeFunType(d)
  20.             tenv1 = tenv1 + (fun -> funtype)
  21.             for (param <- params)
  22.               val in = getType(param.opttype, ctenv1)
  23.               tenv1 = tenv1 + (param.x -> in.getOrElse(throw TypeError(s"Type annotation missing at parameter ${param.x}", param)))
  24.             val out = typeCheck(body, tenv1, ctenv1)
  25.             val optionaltype = getType(optrestype, ctenv1)
  26.             checkTypesEqual(out, optionaltype, body)
  27.           case null => throw TypeError(s"Expected DefDecl", e)
  28.         }
  29.       }
  30.         for (c <- classes) {
  31.           val ct2 = makeStaticClassType(c, ctenv, classes)
  32.           ctenv1 = ctenv1 + (c.klass -> ct2) //første del
  33.           val cp2 = c.params
  34.           val ctp2 = ct2.params
  35.           if (cp2.length != ctp2.length) throw TypeError("what", e) //hvis ikke de er lige lange er de ikke ens
  36.           for ((t, e) <- (cp2.zip(ctp2)))
  37.             tenv1 = tenv1 + (t.x -> e)
  38.           typeCheck(c.body, tenv1, ctenv1)
  39.  
  40.         }
  41.         if (exps.size > 0) {
  42.           for (e <- exps)
  43.             typeCheck(e, tenv1, ctenv1)
  44.           typeCheck(exps.last, tenv1, ctenv1)
  45.         }
  46.         else {
  47.           unitType //tom type
  48.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement