X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=sem.icl;h=66d9024ab292dd45b00576485b912069a35d7fe1;hb=302891ef956bd735780714742850947bf7588ce5;hp=43df3a3b2aa89d7296352706afd7f7af1a3e8367;hpb=72fb877d00efbba5cc4540ee2e76fbb01c6f572d;p=cc1516.git diff --git a/sem.icl b/sem.icl index 43df3a3..66d9024 100644 --- a/sem.icl +++ b/sem.icl @@ -18,6 +18,7 @@ import StdString import StdTuple import StdList import StdBool +import GenEq from Text import class Text(concat), instance Text String @@ -32,7 +33,7 @@ from parse import :: ParserOutput, :: Error instance MonadTrans (StateT Gamma) where liftT m = StateT \s-> m >>= \a-> return (a, s) -get = gets id +get :== gets id sem :: AST -> SemOutput sem (AST vd fd) = case runStateT m ('Map'.newMap, getRandomStream 1) of @@ -54,15 +55,21 @@ semFunDecl fd=:(FunDecl p f args mt vds stmts) = matchFunctions args ft >>= \tres-> mapM semVarDecl vds >>= \newvds-> mapM (checkStmt tres) stmts >>= \newstmts-> - pure IntType >>= \returntype-> case mt of - Nothing = reconstructType args returntype - >>= \ftype->restoreGamma gamma + Nothing = inferReturnType stmts + >>= \returntype->reconstructType args returntype + >>= \ftype->restoreGamma gamma >>| putIdent f ftype >>| pure ( FunDecl p f args (Just ftype) newvds newstmts) Just t = restoreGamma gamma >>| pure (FunDecl p f args mt newvds newstmts) +inferReturnType :: [Stmt] -> Env Type +inferReturnType [] = pure VoidType +inferReturnType [ReturnStmt (Just t):rest] = typeExpr t +inferReturnType [ReturnStmt _:rest] = pure VoidType +inferReturnType [_:rest] = inferReturnType rest + reconstructType :: [String] Type -> Env Type reconstructType [] t = pure t reconstructType [x:xs] t = gets (\(st, r)->'Map'.get x st) @@ -270,3 +277,8 @@ saveGamma = get restoreGamma :: Gamma -> Env Void restoreGamma (oldstate, _) = gets snd >>= \newr->put (oldstate, newr) + +derive gEq Type +instance == Type where + (==) (IdType _) (IdType _) = True + (==) o1 o2 = gEq{|*|} o1 o2