]> ruin.nu Git - proglang.git/commitdiff
introduced pushAndPop in the typechecker too
authorMichael Andreen <harv@ruin.nu>
Thu, 2 Mar 2006 20:41:09 +0000 (20:41 +0000)
committerMichael Andreen <harv@ruin.nu>
Thu, 2 Mar 2006 20:41:09 +0000 (20:41 +0000)
Typecheck.hs

index a78f8f02c6a51d5d6d643d01ee8a4232f4223dab..cdba298976ad2aefcecaf7e71a52b74ebb6415f0 100644 (file)
@@ -56,27 +56,25 @@ findVariable :: (MonadState Types m) => Ident -> Types -> m Type
 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
 
 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 :: (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
 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
 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
 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