added argument mismatch
authorMart Lubbers <mart@martlubbers.net>
Thu, 14 Apr 2016 06:58:55 +0000 (08:58 +0200)
committerMart Lubbers <mart@martlubbers.net>
Thu, 14 Apr 2016 06:58:55 +0000 (08:58 +0200)
sem.dcl
sem.icl

diff --git a/sem.dcl b/sem.dcl
index e981361..584deb5 100644 (file)
--- 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 (file)
--- 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