Merge branch 'master' of https://github.com/dopefishh/cc1516
authorpimjager <pim@pimjager.nl>
Wed, 13 Apr 2016 09:37:35 +0000 (11:37 +0200)
committerpimjager <pim@pimjager.nl>
Wed, 13 Apr 2016 09:37:35 +0000 (11:37 +0200)
1  2 
sem.icl

diff --combined 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]