From: Mart Lubbers Date: Tue, 24 May 2016 10:52:29 +0000 (+0200) Subject: add function dictionary 1func X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=f800a34210fde2a3ce8400a910dbdce3f11e3bf6;p=cc1516.git add function dictionary 1func --- diff --git a/examples/high.spl b/examples/high.spl index 65f8434..af750ab 100644 --- a/examples/high.spl +++ b/examples/high.spl @@ -2,24 +2,8 @@ plus(x, y) { return x + y; } -run(x) { - x(); - return; -} - -helloworld() { - print('h':'e':'l':'l':'o':' ':'w':'o':'r':'l':'d':'!':[]); - return; -} - main (){ - var abc = "hello world"; - var a = read; - var b = read(); - var c = plus; - var d = plus(1); - var e = plus(1, 2); - var f = d(41); - run(helloworld); +// var c = plus; +// var d = plus(1); return 5; } diff --git a/gen.icl b/gen.icl index 6020d03..ae1c829 100644 --- a/gen.icl +++ b/gen.icl @@ -33,33 +33,55 @@ FALSE :== 0 :: SSMProgram :== [Instr] :: GenError = Error String :: Addressbook :== 'Map'.Map String Address -:: Address = LAB String Int | ADDR Int +:: Address = LAB String Int Int | ADDR Int :: Gen a :== RWST () SSMProgram (Addressbook, [Label]) (Either GenError) a labelStream :: [Label] labelStream = ["lbl_" +++ toString i\\i<-[1..]] -defaultAddressBook :: Addressbook -defaultAddressBook = extend "1printint" (LAB "1printint" 1) - $ extend "1printchar" (LAB "1printchar" 1) - $ extend "read" (LAB "read" 0) - $ extend "1readint" (LAB "1readint" 0) - $ extend "isEmpty" (LAB "isempty" 1) - 'Map'.newMap +defaultAddressBook :: [FunDecl] -> Addressbook +defaultAddressBook fd = extend "1printint" (LAB "1printint" 1 0) + $ extend "1printchar" (LAB "1printchar" 1 1) + $ extend "read" (LAB "read" 0 2) + $ extend "1readint" (LAB "1readint" 0 3) + $ extend "isEmpty" (LAB "isempty" 1 4) + $ addFuncs fd 5 + where + addFuncs [] _ = 'Map'.newMap + addFuncs [(FunDecl _ k args _ _ _):xs] n = + extend k (LAB k (length args) n) $ addFuncs xs (n+1) gen :: AST -> Either String String -gen (AST fds) = case evalRWST prog () (defaultAddressBook, labelStream) of +gen (AST fds) = case evalRWST prog () (defaultAddressBook fds, labelStream) of Left (Error e) = Left e Right (_, p) = Right $ toString p where prog = tell [ Instr "bsr" [L "main"] "", Instr "halt" [] "" - ] >>| tell programContext + ] >>| tell (programContext fds) >>| mapM_ g fds -programContext :: SSMProgram -programContext = [Lab "1printint" +programContext :: [FunDecl] -> SSMProgram +programContext x = [Lab "1func" + ,Instr "link" [Lit 0] "" + :fS ["1printint" ,"1printchar" + ,"read" ,"1readint" + ,"isEmpty":map (\(FunDecl _ k _ _ _ _)->k) x] 0] ++ + [Instr "unlink" [] "" + ,Instr "ret" [] "":context] + where + + fS :: [String] Int -> SSMProgram + fS [] _ = [] + fS [k:xs] n = [ + Instr "ldl" [Lit -2] "" + ,Instr "ldc" [Lit n] $ "branch to: " +++ k + ,Instr "eq" [] "" + ,Instr "brt" [L k] "" + :fS xs $ n+1] + context :: SSMProgram + context = [Lab "1printint" ,Instr "link" [Lit 0] "" ,Instr "ldl" [Lit -2] "load first argument" ,Instr "trap" [Lit 0] "print int" @@ -71,12 +93,6 @@ programContext = [Lab "1printint" ,Instr "trap" [Lit 1] "print char" ,Instr "unlink" [] "" ,Instr "ret" [] "" - ,Lab "1readint" - ,Instr "link" [Lit 0] "" - ,Instr "trap" [Lit 10] "read int" - ,Instr "str" [Raw "RR"] "" - ,Instr "unlink" [] "" - ,Instr "ret" [] "" ,Lab "read" ,Instr "link" [Lit 0] "" ,Instr "trap" [Lit 11] "read char" @@ -162,7 +178,7 @@ instance g Expr where Just (ADDR t) = tell [Instr "ldl" [Lit t] ""] >>| mapM_ g fs >>| pure () _ = liftT (Left $ Error "Higher order functions not implemented") g (FunExpr _ k es fs) = getAdressbook >>= \ab->case 'Map'.get k ab of - Just (LAB l arity) = if (arity <> (length es)) + Just (LAB l arity _) = if (arity <> (length es)) (liftT $ Left $ Error "Higher order functions not implemented") ( mapM_ g es >>| jump "bsr" k @@ -173,7 +189,7 @@ instance g Expr where jump :: String String -> Gen () jump instr k = getAdressbook >>= \ab->case 'Map'.get k ab of Nothing = liftT (Left $ Error $ concat ["PANIC: ", k, " not found as function"]) - Just (LAB t _) = tell [Instr instr [L t] (k +++"()")] + Just (LAB t _ _) = tell [Instr instr [L t] (k +++"()")] Just (ADDR t) = liftT (Left $ Error $ "PANIC: jump should go to label") instance g Stmt where @@ -199,7 +215,7 @@ instance g Stmt where g (AssStmt (VarDef k fs) e) = g e >>| getAdressbook >>= \ab->case 'Map'.get k ab of Nothing = liftT (Left $ Error $ concat ["PANIC: ", k, " not found as var"]) - Just (LAB t _) = liftT (Left $ Error $ "PANIC: cannot assign to function") + Just (LAB t _ _) = liftT (Left $ Error $ "PANIC: cannot assign to function") Just (ADDR t) = tell [Instr "stl" [Lit t] ""] g (FunStmt k es fs) = mapM_ g es >>| jump "bsr" k @@ -224,7 +240,6 @@ addVars [x:xs] = \ab->extend x (ADDR (-2 - (length xs))) (addVars xs ab) instance g FunDecl where g (FunDecl _ k args _ vds stms) = //varDecls can call the enclosing function, so first reserve a label for it - updateAdressbook (extend k (LAB k (length args))) >>| getAdressbook >>= \oldMap -> updateAdressbook (addVars args) >>| tell [Lab k] >>|