about summary refs log tree commit diff
path: root/src/Typecheck.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Typecheck.hs')
-rw-r--r--src/Typecheck.hs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/Typecheck.hs b/src/Typecheck.hs
new file mode 100644
index 0000000..d8b8128
--- /dev/null
+++ b/src/Typecheck.hs
@@ -0,0 +1,43 @@
+module Typecheck
+(inferExpr,
+ checkExpr)
+  where
+import Syntax
+import Control.Monad
+type Environment = [(Idnt,Typ)]
+
+assertInt TInt = Just ()
+assertInt _ = Nothing
+assertRec (Record _) = Just ()
+assertRec _ = Nothing
+assertVar (Variant _ _) = Just ()
+assertVar _ = Nothing
+assertPtr (TPtr _) = Just ()
+assertPtr _ = Nothing
+
+inferExpr :: Expr -> Environment -> Maybe Typ
+inferExpr (Var name) env = lookup name env
+inferExpr (IntLit _) _ = Just TInt
+inferExpr (Record _) _ = undefined
+inferExpr (Variant _ _) _ = undefined
+inferExpr (Add e1 e2) env = do
+  checkExpr e1 env TInt
+  checkExpr e1 env TInt
+  return TInt
+inferExpr (Mult e1 e2) env = do
+  checkExpr e1 env TInt
+  checkExpr e1 env TInt
+  return TInt
+inferExpr (Neg e) env = do
+  checkExpr e env TInt
+  return TInt
+inferExpr (Deref e1) env = do
+  t <- inferExpr e1 env
+  assertPtr t
+  return t
+
+checkExpr :: Expr -> Environment -> Typ -> Maybe ()
+checkExpr e env t = do
+  t' <- inferExpr e env
+  guard (t==t')
+  return ()