package tool.analyzer trait TypeChecker { self: Reporter => import Symbols._ import Types._ import parser.Trees._ /** Typechecking does not produce a value, but has the side effect of * attaching types to trees and potentially outputting error messages. */ def typeCheck(prog: Program, gs: GlobalScope): Unit = { /** Suggested inner function: * * Computes the type of an expression. If exp is not empty, checks that * the expression is a subtype of one in exp. If it's not, prints an * error message and returns the first element of exp. Returning a valid * type despite the error is a way to do error recovering: type checking * will continue, assuming the correct type was found. */ def tcExpr(expr: ExprTree, exp: Type*): Type = { // make sure you attach symbols to method calls in the process! } /** for statements... */ def tcStat(stat: StatTree): Unit = { /* ... */ } /* ... */ } }