X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=sem.icl;h=c7a41e95b860f5af510c9332a641d9c896d79ce0;hb=2953e6cc260d8243e5434b7e787258ab073d34d2;hp=77131b097c587444963d86d5512d473816a08157;hpb=f490bc3083cc290680499d4c12be9b732b94fd82;p=cc1516.git diff --git a/sem.icl b/sem.icl index 77131b0..c7a41e9 100644 --- a/sem.icl +++ b/sem.icl @@ -64,6 +64,8 @@ instance toString SemError where toString p, "SemError: No ", toString o, " for type ", toString t] + toString (UndeclaredVariableError p ident) = concat [ + toString p, "SemError: identifier: ", ident, " undefined."] sem :: AST -> SemOutput sem (AST vd fd) = case runStateT m ('Map'.newMap, getRandomStream 1) of @@ -76,7 +78,9 @@ where pure (vds, fds) semFunDecl :: FunDecl -> Env FunDecl -semFunDecl f = pure f +semFunDecl fd=:(FunDecl p f _ mt vds stmts) = case mt of + Nothing = let t = IdType f in putIdent f t >>| pure fd + Just t = putIdent f t >>| pure fd semVarDecl :: VarDecl -> Env VarDecl semVarDecl (VarDecl pos type ident ex) = unify type ex @@ -108,12 +112,20 @@ typeExpr (Op2Expr p e1 op e2) >>= \t2-> unify (ListType t1) t2 typeExpr (EmptyListExpr p) = freshIdent >>= \frsh-> let t = IdType frsh in putIdent frsh t >>| pure t -typeExpr (FunExpr p (FunCall fid args)) = undef //ignore field selectors +typeExpr (FunExpr p (FunCall f es)) = gets (\(st, r)->'Map'.get f st) + >>= \mt-> case mt of + Nothing = let t = IdType f in putIdent f t >>| pure t + Just t = unifyApp t es typeExpr (VarExpr p (VarDef ident fs)) = gets (\(st, r)->'Map'.get ident st) - >>= \mt->case mt of - Nothing = let t = IdType ident in putIdent ident t >>| pure t - Just t = unify t fs + >>= \mt->case mt of + Nothing = liftT $ Left $ UndeclaredVariableError p ident + Just t = unify t fs + +unifyApp :: Type [Expr] -> Env Type +unifyApp t [] = pure t //whoop whoop, functions can return functions +unifyApp (tf1 ->> tf2) [t1:ts] = (->>) <$> unify tf1 t1 <*> (unifyApp tf2 ts) +unifyApp t1 t2 = liftT $ Left $ UnifyError zero t1 (IdType "[expressions, FIXME") class unify a :: Type a -> Env Type