]> ruin.nu Git - proglang.git/blob - Typecheck.hs
typechecker compiles but can't be run
[proglang.git] / Typecheck.hs
1 module Typecheck where 
2
3 import Abssyntax
4 import Control.Monad.State
5 import Data.Map as Map
6 import Prelude hiding (lookup)
7
8
9 type Types = Map Ident Type
10
11 typeCheckExp :: (MonadState Types m) => Exp -> m Type
12 typeCheckExp (BExp e o e') = do
13         TInt <- typeCheckExp e
14         TInt <- typeCheckExp e'
15         return TBool
16 typeCheckExp (OpExp e o e') = do
17         TInt <- typeCheckExp e
18         TInt <- typeCheckExp e'
19         return TInt
20 typeCheckExp (EVar i) = typeCheckVar i
21 typeCheckExp (EAss i e) = do
22         a <- typeCheckVar i
23         b <- typeCheckExp e
24         if a == b then return a else fail "FEL!"
25 typeCheckExp (EInt i) = return TInt
26 typeCheckExp (EBool b) = return TBool
27 typeCheckExp EReadI = return TInt
28 typeCheckExp EReadB = return TBool
29 typeCheckExp (ExpT t e) = do
30         t2 <- typeCheckExp e
31         if t == t2 then return t else fail "FEL!"
32 typeCheckExp EDefault = return NoType
33 typeCheckExp (EPost i op) = do
34         TInt <- typeCheckVar i
35         return TInt
36
37
38 typeCheckVar :: (MonadState Types m) => Ident -> m Type 
39 typeCheckVar i = do
40         e <- get
41         lookup i e
42
43 typeCheckStm :: (MonadState Types m) => Stm -> m Type 
44 typeCheckStm SNoop = return NoType
45 typeCheckStm (SExp e) = do 
46         typeCheckExp e
47         return NoType
48 typeCheckStm (SBlock ss) = do 
49         mapM typeCheckStm ss
50         return NoType
51 typeCheckStm (SIf e s s') = do
52         TBool <- typeCheckExp e
53         NoType <- typeCheckStm s
54         NoType <- typeCheckStm s
55         return NoType
56 typeCheckStm (SWhile e s) = do
57         TBool <- typeCheckExp e
58         NoType <- typeCheckStm s
59         return NoType
60 typeCheckStm (SDecl t i e) = do
61         t2 <- typeCheckExp e
62         if t == t2 then do
63                 m <- get
64                 put (insert i t m)
65                 return NoType
66                 else fail "Så får du inte göra!!!"
67 typeCheckStm (SPrint e) = do
68         typeCheckExp e
69         return NoType
70