4 import Control.Monad.State
6 import Prelude hiding (lookup)
9 type Types = Map Ident Type
11 typeCheckExp :: (MonadState Types m) => Exp -> m Type
12 typeCheckExp (BExp e o e') = do
13 TInt <- typeCheckExp e
14 TInt <- typeCheckExp e'
16 typeCheckExp (OpExp e o e') = do
17 TInt <- typeCheckExp e
18 TInt <- typeCheckExp e'
20 typeCheckExp (EVar i) = typeCheckVar i
21 typeCheckExp (EAss i e) = do
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
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
38 typeCheckVar :: (MonadState Types m) => Ident -> m Type
43 typeCheckStm :: (MonadState Types m) => Stm -> m Type
44 typeCheckStm SNoop = return NoType
45 typeCheckStm (SExp e) = do
48 typeCheckStm (SBlock ss) = do
51 typeCheckStm (SIf e s s') = do
52 TBool <- typeCheckExp e
53 NoType <- typeCheckStm s
54 NoType <- typeCheckStm s
56 typeCheckStm (SWhile e s) = do
57 TBool <- typeCheckExp e
58 NoType <- typeCheckStm s
60 typeCheckStm (SDecl t i e) = do
66 else fail "Så får du inte göra!!!"
67 typeCheckStm (SPrint e) = do