import Data.Map as Map
import Prelude hiding (lookup)
-
type Types = Map Ident Type
inList :: Eq a => a -> [a] -> Bool
typeCheckExp (BiOpExp e o e') = do
t1 <- typeCheckExp e
t2 <- typeCheckExp e'
- if not(t1 == t2) then fail ""
- else case inList o [Eq,NEq] of
- True -> return TBool
- False -> if not(t1 == TInt) then fail ""
- else case inList o [Plus,Minus,Times,Div] of
- True -> return TInt
- False -> return TBool
+ if not(t1 == t2) then fail "The parameters for the binary operator aren't equal"
+ else if inList o [Eq,NEq] then return TBool
+ else if not(t1 == TInt) then fail "The parameters need to be of type int"
+ else if inList o [Plus,Minus,Times,Div]
+ then return TInt
+ else return TBool
typeCheckExp (EVar i) = typeCheckVar i
typeCheckExp (EAss i e) = do
a <- typeCheckVar i
typeCheckExp (ENeg e) = do
TInt <- typeCheckExp e
return TInt
-
+typeCheckExp (ENot e) = do
+ TBool <- typeCheckExp e
+ return TBool
typeCheckVar :: (MonadState Types m) => Ident -> m Type
typeCheckVar i = do
typeCheckStm (SPrint e) = do
typeCheckExp e
return NoType
-