From: Mart Lubbers Date: Thu, 14 Apr 2016 06:58:55 +0000 (+0200) Subject: added argument mismatch X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=76d648be58ffa5c21cb9a53fb0232ab16d9f81b4;p=cc1516.git added argument mismatch --- diff --git a/sem.dcl b/sem.dcl index e981361..584deb5 100644 --- a/sem.dcl +++ b/sem.dcl @@ -11,6 +11,7 @@ from StdOverloaded import class toString | FieldSelectorError Pos Type FieldSelector | OperatorError Pos Op2 Type | UndeclaredVariableError Pos String + | ArgumentMisMatchError Pos String | Error String :: Gamma :: SemOutput :== Either [SemError] (AST, Gamma) diff --git a/sem.icl b/sem.icl index e2227d1..06200b1 100644 --- a/sem.icl +++ b/sem.icl @@ -23,7 +23,6 @@ import GenEq from Text import class Text(concat), instance Text String import AST -from parse import :: ParserOutput, :: Error :: Gamma :== ('Map'.Map String Type, [String]) :: Env a :== StateT Gamma (Either SemError) a @@ -88,12 +87,15 @@ genType [x:xs] = liftM2 (->>) (freshIdent >>= \fi->pure $ IdType fi) (genType xs) matchFunctions :: [String] Type -> Env Type -matchFunctions [] (_ ->> _) = liftT $ Left $ Error "Not enough arguments" -matchFunctions _ (VoidType ->> _) = liftT $ Left $ Error "Cannot have a void type in the middle of the function definition" +matchFunctions [] (_ ->> _) = liftT $ Left $ + ArgumentMisMatchError zero "Not enough arguments" +matchFunctions _ (VoidType ->> _) = liftT $ Left $ + ArgumentMisMatchError zero "Void can't be a non return type" matchFunctions [x:xs] (t1 ->> t2) = modify (\(st, r)->('Map'.put x t1 st, r)) >>| matchFunctions xs t2 matchFunctions [] t = pure t -matchFunctions _ t = liftT $ Left $ Error "Too much argumnts" +matchFunctions _ t = liftT $ Left $ + ArgumentMisMatchError zero "Too much argumnts" semVarDecl :: VarDecl -> Env VarDecl semVarDecl (VarDecl pos type ident ex) = unify type ex @@ -262,15 +264,12 @@ replace ident type = get >>= \(st, fr)->put ('Map'.fromList $ itupdate _ _ k = k instance toString SemError where - toString (ParseError p e) = concat [ - toString p,"SemError: ParseError: ", e] - toString (Error e) = "SemError: " +++ e - toString (UnifyError p t1 t2) = concat [ - toString p, + toString (ParseError p e) = concat [toString p, + "SemError: ParseError: ", e] + toString (UnifyError p t1 t2) = concat [ toString p, "SemError: Cannot unify types. Expected: ", toString t1, ". Given: ", toString t2] - toString (FieldSelectorError p t fs) = concat [ - toString p, + toString (FieldSelectorError p t fs) = concat [ toString p, "SemError: Cannot select ", toString fs, " from type: ", toString t] toString (OperatorError p o t) = concat [ @@ -279,6 +278,9 @@ instance toString SemError where toString t] toString (UndeclaredVariableError p ident) = concat [ toString p, "SemError: identifier: ", ident, " undefined."] + toString (ArgumentMisMatchError p s) = concat [toString p, + "SemError: Argument mismatch: ", s] + toString (Error e) = "SemError: " +++ e saveGamma :: Env Gamma saveGamma = get