From f081c2c5e248331eb6e2f090f4afe818fd8259eb Mon Sep 17 00:00:00 2001 From: pimjager Date: Thu, 19 May 2016 18:05:38 +0200 Subject: [PATCH] Added default functions, isEmpty does not typecheck... --- examples/codeGen.spl | 44 +++++++++++++++++++++++++++++------------- gen.icl | 46 ++++++++++++++++++++++++++++++++------------ sem.icl | 8 +++++++- 3 files changed, 72 insertions(+), 26 deletions(-) diff --git a/examples/codeGen.spl b/examples/codeGen.spl index 34474a7..ebede23 100644 --- a/examples/codeGen.spl +++ b/examples/codeGen.spl @@ -1,18 +1,36 @@ -f(x, y) { - var ret = 0; - if (x < y) { - ret = x; - } - else { - ret = y; +//f(x, y) { +// var ret = 0; +// if (x < y) { +// ret = x; +// } +// else { +// ret = y; +// } +// return ret; +//}// + +//main() { +// Int x1 = 1; +// var x2 = 4; +// var x3 = f(x1, x2); +// print(x1); +// x1 = 5; +// return x3 + x1; +//} + +isE(x) :: [a] -> Bool { + if (x == []) { + return True; + } else { + return False; } - return ret; } main() { - Int x1 = 1; - var x2 = 4; - var x3 = f(x1, x2); - x1 = 5; - return x3 + x1; + [Int] x1 = 1 : 2 : []; + [Int] x2 = 0 : x1; + [Int] x3 = []; + //Bool y1 = isEmpty(x2); //gives weird type error, not sure why + isEmpty(x2); + return; } diff --git a/gen.icl b/gen.icl index 89af77c..d139804 100644 --- a/gen.icl +++ b/gen.icl @@ -39,24 +39,45 @@ FALSE :== 0 labelStream :: [Label] labelStream = ["lbl_" +++ toString i\\i<-[1..]] +defaultAddressBook :: Addressbook +defaultAddressBook = extend "print" (LAB "print") + $ extend "read" (LAB "read") + $ extend "isEmpty" (LAB "isEmpty") + 'Map'.newMap + gen :: AST -> Either String String -gen (AST fds) = case evalRWST prog () ('Map'.newMap, labelStream) of +gen (AST fds) = case evalRWST prog () (defaultAddressBook, labelStream) of Left (Error e) = Left e Right (_, p) = Right $ toString p where prog = tell [ Instr "bsr" [L "main"] "", Instr "halt" [] "" - ] >>| mapM_ g fds - -//Current issues: -//All VarDecls are added as function, how to deal with assignments? -// (And when we deal with assignments, how to deal with assignments to higher order functions?) -//Dealing with arguments -//Dealing with types that do not fit on the Stack -// Probably completely change LoadPlace to a Type and a position relative to *something* -// And where the type determines if this position is a pointer to the heap or an -// unboxed value + ] >>| tell programContext + >>| mapM_ g fds + +programContext :: SSMProgram +programContext = [Lab "print" //there is no actual IO in SSM + ,Instr "link" [Lit 0] "" + ,Instr "unlink" [] "" + ,Instr "ret" [] "" + ,Lab "read" //there is no actual IO in SSM + ,Instr "link" [Lit 0] "" + ,Instr "ldc" [Lit 0] "" + ,Instr "sth" [] "" + ,Instr "str" [Raw "RR"] "" + ,Instr "unlink" [] "" + ,Instr "ret" [] "" + ,Lab "isEmpty" + ,Instr "link" [Lit 0] "" + ,Instr "ldl" [Lit -2] "load prt to list" + ,Instr "lda" [Lit 0] "derefrence ptr" + ,Instr "ldc" [Lit 0] "" + ,Instr "eq" [] "test for null pointer" + ,Instr "str" [Raw "RR"] "" + ,Instr "unlink" [] "" + ,Instr "ret" [] "" + ] //helper functions for the gen monad getAdressbook :: Gen Addressbook @@ -158,8 +179,9 @@ instance g Stmt where Just (LAB t) = liftT (Left $ Error $ "PANIC: cannot assign to function") Just (ADDR t) = tell [Instr "stl" [Lit t] ""] g (FunStmt k es) = mapM_ g es - >>| mapM_ (const $ tell [Instr "ajs" [Lit -1] ""]) es //clean up args >>| jump "bsr" k + >>| mapM_ (const $ tell [Instr "ajs" [Lit -1] ""]) es //clean up args + >>| pure () g (ReturnStmt Nothing) = tell [Instr "unlink" [] ""] >>| tell [Instr "ret" [] ""] g (ReturnStmt (Just e)) = g e diff --git a/sem.icl b/sem.icl index af49fdf..0da9c77 100644 --- a/sem.icl +++ b/sem.icl @@ -48,11 +48,17 @@ instance zero Gamma where variableStream :: [TVar] variableStream = map toString [1..] +defaultGamma :: Gamma //includes all default functions +defaultGamma = extend "print" (Forall ["a"] ((IdType "a") ->> VoidType)) + $ extend "isEmpty" (Forall ["a"] (ListType (IdType "a") ->> BoolType)) + $ extend "read" (Forall [] (IntType ->> (ListType CharType))) + zero + sem :: AST -> Either [SemError] AST sem (AST fd) = case foldM (const $ hasNoDups fd) () fd >>| foldM (const isNiceMain) () fd >>| hasMain fd - >>| evalStateT (type fd) (zero, variableStream) of + >>| evalStateT (type fd) (defaultGamma, variableStream) of Left e = Left [e] Right (_,fds) = Right (AST fds) where -- 2.20.1