X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Typecheck.hs;h=a701b6e85bf92a0e9f0807251e5eecbfa83c7592;hb=8fdc0177fdf518f63819e5b98dd0368fccca6175;hp=18146506a227857ce792198ba9e8575491c7f553;hpb=9254ff63648d9a6f4b058c0a53438db7b60a28cd;p=proglang.git diff --git a/Typecheck.hs b/Typecheck.hs index 1814650..a701b6e 100644 --- a/Typecheck.hs +++ b/Typecheck.hs @@ -1,4 +1,4 @@ -module Typecheck (typeCheckExp, typeCheckStm, typeCheckVar, typeCheckFunction, addFunction, State(..)) where +module Typecheck (typeCheckExp, typeCheckStm, typeCheckVar, typeCheckFunction, addFunction, emptyState, State(..)) where import Abssyntax @@ -11,6 +11,7 @@ type Function = (Type, [Type]) data State = State {variables::Types,functions::(Map Ident Function),function::Ident} +emptyState = State{variables=[empty], functions=(empty), function=(Ident "")} inList :: Eq a => a -> [a] -> Bool inList _ [] = False @@ -50,6 +51,20 @@ typeCheckExp (ENeg e) = do typeCheckExp (ENot e) = do TBool <- typeCheckExp e return TBool +typeCheckExp (EFunc i as) = do + state <- get + (t,ts) <- lookup i $ functions state + checkParams as ts + return t + +checkParams :: (MonadState State m) => [Exp] -> [Type] -> m () +checkParams [] [] = return () +checkParams [] _ = fail "Too for arguments when calling function" +checkParams _ [] = fail "Too many arguments when calling function" +checkParams (e:es) (t:ts) = do + t2 <- typeCheckExp e + assert (t == t2) "Arugments does not match" + checkParams es ts typeCheckVar :: (MonadState State m) => Ident -> m Type typeCheckVar i = do