Advertisement
Guest User

Untitled

a guest
May 10th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.48 KB | None | 0 0
  1. module TypeChecker
  2. open Syntax
  3.  
  4. let getFunArgType funName env =
  5.     let funType = Map.find funName env
  6.     match funType with
  7.     | FuncType(left, right) -> left
  8.     | BoolType              -> BoolType
  9.     | IntType               -> IntType
  10.  
  11. let rec checkExpr expr env =
  12.     match expr with
  13.     | ConstBool b                       -> BoolType
  14.     | ConstInt i                        -> IntType
  15.     | Var name                          -> Map.find name env
  16.     | PrimOp ("+", lOper, rOper)        -> checkIntOp lOper rOper env
  17.     | PrimOp ("-", lOper, rOper)        -> checkIntOp lOper rOper env
  18.     | PrimOp ("*", lOper, rOper)        -> checkIntOp lOper rOper env
  19.     | PrimOp ("/", lOper, rOper)        -> checkIntOp lOper rOper env
  20.     | PrimOp (">", lOper, rOper)        -> checkIntOp lOper rOper env
  21.     | PrimOp ("<", lOper, rOper)        -> checkIntOp lOper rOper env
  22.     | PrimOp ("=", lOper, rOper)        -> checkBinOp lOper rOper env
  23.     | If (ifExpr, thenExpr, elseExpr )  -> checkIf ifExpr thenExpr elseExpr env
  24.     | Let(name, valExpr, restExpr)      -> checkLet name valExpr restExpr env
  25.     | FunCall (name, arg)               -> checkFunCall name arg env
  26.     | _                                 -> failwith "Syntax error"  
  27.  
  28. and checkLet name valExpr restExpr env =
  29.     let valType = checkExpr valExpr env
  30.     let updatedEnv = Map.add name valType env
  31.     checkExpr restExpr updatedEnv
  32.  
  33. and checkIf ifExpr thenExpr elseExpr env =
  34.     let ifType = checkExpr ifExpr env
  35.     let thenType = checkExpr thenExpr env
  36.     let elseType = checkExpr elseExpr env
  37.     if ifType = BoolType && thenExpr = elseExpr then thenType else failwith "Error"
  38.  
  39. and checkIntOp lOper rOper env =
  40.     let lType = checkExpr lOper env
  41.     let rType = checkExpr rOper env
  42.     if lType = rType && rType = IntType then lType else failwith "Error"
  43.  
  44. and checkBinOp lOper rOper env =
  45.     let lType = checkExpr lOper env
  46.     let rType = checkExpr rOper env
  47.     if (lType = IntType || lType = BoolType) && lType = rType then rType else failwith "Error"
  48.  
  49. and checkFunCall name arg env =
  50.     let paramType = checkExpr arg env
  51.     match name with
  52.     | (Var funName) -> if (getFunArgType funName env) = paramType then paramType else failwith "Illegal parm type"
  53.     | _             -> failwith "Syntax error: expected (Var name)"      
  54.  
  55. let checkFunDef name typeDef expr env =
  56.     let updatedEnv = Map.add name typeDef env
  57.     checkExpr expr updatedEnv
  58.  
  59. let checkProgram program =
  60.     let env =
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement