findVariable i [] = fail $ "Variable "++show i++" not found in any scope."
findVariable i (m:ms) = if member i m then lookup i m else findVariable i ms
+pushAndPop :: (MonadState Types m) => m a -> m ()
+pushAndPop s = do
+ modify (empty:)
+ s
+ modify tail
+
typeCheckStm :: (MonadState Types m) => Stm -> m ()
typeCheckStm SNoop = return ()
typeCheckStm (SExp e) = do
typeCheckExp e
return ()
-typeCheckStm (SBlock ss) = do
- modify (empty:)
- mapM typeCheckStm ss
- modify tail
+typeCheckStm (SBlock ss) = pushAndPop $ mapM typeCheckStm ss
typeCheckStm (SIf e s s') = do
TBool <- typeCheckExp e
- modify (empty:)
- typeCheckStm s
- modify (\s -> empty:tail s)
- typeCheckStm s'
- modify tail
+ pushAndPop $ typeCheckStm s
+ pushAndPop $ typeCheckStm s'
typeCheckStm (SWhile e s) = do
TBool <- typeCheckExp e
- modify (empty:)
- typeCheckStm s
- modify tail
+ pushAndPop $ typeCheckStm s
typeCheckStm (SDecl t i e) = do
t2 <- typeCheckExp e
assert (t == t2) $ "Illegal to assign an expression of type "++show t2++" to variable "++show i++" of type "++show t