X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Typecheck.hs;h=1b0baa00ed5d48dc760f029f9759e8bb821eed9c;hb=9625a8a7eb7aebeb161ca15cf66cff5699f89103;hp=cdba298976ad2aefcecaf7e71a52b74ebb6415f0;hpb=fe6d5e0ac088e6b648a5029b101402c017fd04de;p=proglang.git diff --git a/Typecheck.hs b/Typecheck.hs index cdba298..1b0baa0 100644 --- a/Typecheck.hs +++ b/Typecheck.hs @@ -1,4 +1,4 @@ -module Typecheck (typeCheckExp, typeCheckStm, typeCheckVar) where +module Typecheck (typeCheck,typeCheckExp, typeCheckStm, typeCheckVar) where import Abssyntax @@ -16,6 +16,9 @@ assert :: Monad m => Bool -> String -> m () assert True _ = return () assert False s = fail s +typeCheck :: [Stm] -> IO () +typeCheck s = runStateT (mapM typeCheckStm s) [empty] >> return () + typeCheckExp :: (MonadState Types m) => Exp -> m Type typeCheckExp (BiOpExp e o e') = do t1 <- typeCheckExp e @@ -75,13 +78,18 @@ typeCheckStm (SIf e s s') = do typeCheckStm (SWhile e s) = do TBool <- typeCheckExp e pushAndPop $ typeCheckStm s +typeCheckStm (SDeclD t i) = addVariable i 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 + addVariable i t +typeCheckStm (SPrint e) = do + typeCheckExp e + return () + +addVariable :: (MonadState Types m) => Ident -> Type -> m () +addVariable i t = do (m:ms) <- get case insertLookupWithKey (\k a1 a2 -> a1) i t m of (Nothing,m') -> put (m':ms) _ -> fail $ "Duplicate variable declaration: "++show i -typeCheckStm (SPrint e) = do - typeCheckExp e - return ()