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
36 typeCheckExp (ENeg e) = do
37 TInt <- typeCheckExp e
41 typeCheckVar :: (MonadState Types m) => Ident -> m Type
46 typeCheckStm :: (MonadState Types m) => Stm -> m Type
47 typeCheckStm SNoop = return NoType
48 typeCheckStm (SExp e) = do
51 typeCheckStm (SBlock ss) = do
54 typeCheckStm (SIf e s s') = do
55 TBool <- typeCheckExp e
56 NoType <- typeCheckStm s
57 NoType <- typeCheckStm s
59 typeCheckStm (SWhile e s) = do
60 TBool <- typeCheckExp e
61 NoType <- typeCheckStm s
63 typeCheckStm (SDecl t i e) = do
65 if t == t2 || t2 == NoType then do
69 else fail $ "Illegal to assign an expression of type "++show t2++" to variable "++show i++" of type "++show t
70 typeCheckStm (SPrint e) = do