From: pimjager Date: Wed, 13 Apr 2016 09:37:35 +0000 (+0200) Subject: Merge branch 'master' of https://github.com/dopefishh/cc1516 X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=3b2d959ee14ecfd95008dfe536c87b8b1629c1ae;hp=-c;p=cc1516.git Merge branch 'master' of https://github.com/dopefishh/cc1516 --- 3b2d959ee14ecfd95008dfe536c87b8b1629c1ae diff --combined sem.icl index f0241e1,c5e14f3..19092df --- a/sem.icl +++ b/sem.icl @@@ -35,7 -35,7 +35,7 @@@ get = gets i getRandomStream :: Int -> [String] getRandomStream i = genIdents $ filter (isAlpha o toChar) (genRandInt i) where - genIdents r = let (ic, r) = splitAt 5 r in [toString ic: genIdents r] + genIdents r = let (ic, r2) = splitAt 5 r in [toString ic: genIdents r2] freshIdent :: Env String freshIdent = get >>= \(st, [ident:rest])-> put (st, rest) @@@ -59,9 -59,9 +59,9 @@@ instance toString SemError wher toString t1, ". Given: ", toString t2] sem :: AST -> SemOutput -sem (AST vd fd) = case runStateT m ('Map'.newMap, getRandomStream 0) of +sem (AST vd fd) = case evalStateT m ('Map'.newMap, getRandomStream 1) of Left e = Left [e] - Right (vds, fds) = Right (AST vds fds) + Right ((vds, fds), gamma) = Right ((AST vds fds), gamma) where m :: Env (([VarDecl], [FunDecl])) m = (mapM semVarDecl vd) >>= \vds -> @@@ -105,9 -105,9 +105,9 @@@ typeExpr (Op2Expr p e1 BiOr e2) = unif //a typeExpr (Op2Expr p e1 BiCons e2) = typeExpr e1 >>= \t1-> typeExpr e2 >>= \t2-> unify (ListType t1) t2 -//typeExpr (FunExpr p FunCall) = undef -typeExpr (EmptyListExpr p) = freshIdent >>= \frsh-> let t = IdType frsh in +typeExpr (EmptyListExpr p) = freshIdent >>= \frsh-> let t = IdType frsh in putIdent frsh t >>| pure t +//typeExpr (FunExpr p FunCall) = undef //typeExpr (VarExpr Pos VarDef) = undef //when checking var-expr, be sure to //put the infered type in the context @@@ -127,15 -127,11 +127,15 @@@ instance unify Expr wher Right t = Right t //note, t :: (Type, Gamma) where m = typeExpr e >>= \tex-> unify t tex +//unify e (IdType i) = unify (IdType i) e + //note, don't use putIdent as that will call unify again + //unify (IdType i) e=:(IdType j) = modify (\(st, r)->('Map'.put j e st, r)) + instance unify Type where unify IntType IntType = pure IntType unify BoolType BoolType = pure BoolType unify CharType CharType = pure CharType - unify (ListType t1) (ListType t2) = unify t1 t2 + //unify (ListType t1) (ListType t2) = unify t1 t2 unify t1 t2 = liftT $ Left $ UnifyError zero t1 t2 instance zero Pos where @@@ -159,4 -155,8 +159,8 @@@ extrPos (CharExpr p _) = extrPos (BoolExpr p _) = p extrPos (FunExpr p _) = p extrPos (EmptyListExpr p) = p - extrPos (TupleExpr p _) = p + extrPos (TupleExpr p _) = p + + instance toString Gamma where + toString (mp, _) = concat + [concat [k, ": ", toString v, "\n"]\\(k, v) <- 'Map'.toList mp]