toString (ParseError p e) = concat [
toString p,"SemError: ParseError: ", e]
toString (Error e) = "SemError: " +++ e
+ toString (UnifyErrorStub t1 t2) = toString (UnifyError {line=0,col=0} t1 t2)
toString (UnifyError p t1 t2) = concat [
toString p,
"SemError: Cannot unify types. Expected: ",
semFunDecl f = pure $ Right f
semVarDecl :: VarDecl -> Env VarDecl
-semVarDecl v = pure $ Right v
+semVarDecl vd=:(VarDecl pos type ident ex) = unify type ex
+ >>= \et->pure (
+ et >>= \t->pure $ VarDecl pos t ident ex)
//Right v
-//semVarDecl vd=:(VarDecl pos type ident expr) = case unify type expr of // Left e = Left e
// //TODO ident in de environment
// Right e = Right $ pure vd
typeOp1 :: Pos Expr Type -> Env Type
-typeOp1 p expr rtype = typeExpr expr >>= \exprtype->case exprtype of
- Left e = pure $ Left e
- Right rtype = pure $ Right rtype
- Right (IdType ident) = putIdent ident rtype >>| pure (Right rtype)
- Right t = pure $ Left $ UnifyError p rtype t
+typeOp1 p expr rtype = unify rtype expr
typeExpr :: Expr -> Env Type
typeExpr (IntExpr _ _) = pure $ Right IntType
typeExpr (TupleExpr p (e1, e2)) = typeExpr e1
>>= \ete1->typeExpr e2 >>= \ete2->pure (
ete1 >>= \te1->ete2 >>= \te2->Right $ TupleType (te1, te2))
-//typeExpr (Op1Expr p UnMinus expr) = typeExpr expr
-// >>= \exprtype->case exprtype of
-// IntType = pure $ Right IntType
-// t = Left $ UnifyError p IntType exprtype
//typeExpr (Op2Expr Pos Expr Op2 Expr) = undef
//typeExpr (FunExpr Pos FunCall) = undef
//typeExpr (EmptyListExpr Pos) = undef
class unify a :: Type a -> Env Type
+instance unify Expr where
+ unify (_ ->> _) e = pure $ Left $ ParseError (extrPos e)
+ "Expression cannot be a higher order function. Yet..."
+ unify VoidType e = pure $ Left $ ParseError (extrPos e)
+ "Expression cannot be a Void type."
+ unify (IdType _) e = pure $ Left $ ParseError (extrPos e)
+ "Expression cannot be an polymorf type."
+ unify t e = typeExpr e
+ >>= \eithertype->case eithertype of
+ Left e = pure $ Left e
+ Right tex = unify t tex >>= \eitherun->case eitherun of
+ Left err = pure $ Left $ decErr e err
+ Right t = pure $ Right t
+
instance unify Type where
unify IntType IntType = pure $ Right IntType
unify BoolType BoolType = pure $ Right BoolType
unify CharType CharType = pure $ Right CharType
- unify _ _ = undef
-//
-//instance unify Expr where
-// unify type expr = case type of
-// _ ->> _ = Left $ ParseError (extrPos expr)
-// "Expression cannot be a higher order function. Yet..."
-// VoidType = Left $ ParseError (extrPos expr)
-// "Expression cannot be a Void type."
-// IdType _ = Left $ ParseError (extrPos expr)
-// "Expression cannot be an polymorf type."
-// TupleType (_, _) = undef
-// ListType _ = undef
-// IntType = undef
-// BoolType = undef
-// CharType = undef
-// VarType = undef
+ unify t1 t2 = pure $ Left $ UnifyError zero t1 t2
+
+instance zero Pos where
+ zero = {line=0,col=0}
+
+decErr :: Expr SemError -> SemError
+decErr e (UnifyError _ t1 t2) = UnifyError (extrPos e) t1 t2
+decErr e (ParseError _ s) = ParseError (extrPos e) s
+decErr e err = err
+
+extrPos :: Expr -> Pos
+extrPos (VarExpr p _) = p
+extrPos (Op2Expr p _ _ _) = p
+extrPos (Op1Expr p _ _) = p
+extrPos (IntExpr p _) = p
+extrPos (CharExpr p _) = p
+extrPos (BoolExpr p _) = p
+extrPos (FunExpr p _) = p
+extrPos (EmptyListExpr p) = p
+extrPos (TupleExpr p _) = p