module til-typecheck-stats imports til-typecheck-var strategies typecheck-block = Block(typecheck-stats) typecheck-stats = {| TypeOf : map(typecheck-stat) |} typecheck-stat = typecheck-block <+ typecheck-declaration <+ Assign(id, typecheck-exp) ; try(TypecheckAssign) <+ IfElse(typecheck-exp, typecheck-stats, typecheck-stats) ; TypecheckIf <+ IfThen(typecheck-exp, typecheck-stats) ; TypecheckIf <+ While(typecheck-exp, typecheck-stats) ; TypecheckWhile <+ ProcCall(id, map(typecheck-exp)) ; typecheck-proccall <+ For(id, typecheck-exp, typecheck-exp, typecheck-stats) ; TypecheckFor <+ debug(!"unknown statement: ") ; 1 TypecheckIf : IfElse(e, st1*, st2*) -> IfElse(e, st1*, st2*){TypeName("void")} where e => TypeName("bool") TypecheckIf : IfThen(e, st*) -> IfThen(e, st*){TypeName("void")} where e => TypeName("bool") TypecheckWhile : While(e, st*) -> While(e, st*){TypeName("void")} where e => TypeName("bool") TypecheckFor : For(x, e1, e2, st*) -> For(x, e1, e2, st*){TypeName("void")} where x => TypeName("int") ; e1 => TypeName("int") ; e2 => TypeName("int")