From: Mart Lubbers Date: Thu, 19 May 2016 14:35:25 +0000 (+0200) Subject: return dingen en local vars werken X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=a5c9b65860f9af03a7c999f7abd6ab5f12f63523;p=cc1516.git return dingen en local vars werken --- diff --git a/examples/codeGen.spl b/examples/codeGen.spl index 9982b4b..5b366ba 100644 --- a/examples/codeGen.spl +++ b/examples/codeGen.spl @@ -1,6 +1,5 @@ -f(x) { - Int y = 2; - return 4; +f(x, y) { + return x; } main() { @@ -11,6 +10,7 @@ main() { // [Bool] x5 = True : False : True : True : []; // [Int] x1 = 42 : []; Int x1 = 1; - Int x2 = f(x1); + Int x2 = f(x1, 2); + f(x1, 2); return x1; } diff --git a/gen.icl b/gen.icl index 30bc819..7ad9176 100644 --- a/gen.icl +++ b/gen.icl @@ -74,7 +74,7 @@ fresh = gets snd >>= \vars-> pure (head vars) class g a :: a -> Gen () -// + instance g Op1 where g UnNegation = tell [Instr "not" [] ""] g UnMinus = tell [Instr "neg" [] ""] @@ -167,43 +167,23 @@ foldVarDecl :: Int VarDecl -> Gen Int foldVarDecl x (VarDecl _ _ k e) = g e >>| updateAdressbook (extend k (ADDR x)) >>| pure (x + 1) +addVars :: [String] -> (Addressbook -> Addressbook) +addVars [] = id +addVars [x:xs] = \ab->extend x (ADDR (-2 - (length xs))) (addVars xs ab) + instance g FunDecl where - g (FunDecl _ k _ _ vds stms) = + g (FunDecl _ k args _ vds stms) = //varDecls can call the enclosing function, so first reserve a label for it updateAdressbook (extend k (LAB k)) >>| + getAdressbook >>= \oldMap -> + updateAdressbook (addVars args) >>| tell [Lab k] >>| tell [Instr "link" [Lit 0] ""] >>| //then generate functions for the VarDecls - getAdressbook >>= \oldMap -> foldM foldVarDecl 1 vds >>| //then the main function mapM_ g stms >>| updateAdressbook (const oldMap) >>| pure () -// -//load :: String -> Gen Instr -//load k = genMap >>= \g-> case 'Map'.member k g of -// False = liftT (Left $ Error $ concat ["PANIC: ", k, " not found in variable mapping"]) -// True = loadP $ 'Map'.find k g -// -//loadP :: LoadPlace -> Gen Instr -//loadP pl = dec pl >>= \(instr, arg)-> pure $ Instr instr [arg] "" -//where -// dec (LDA i) = pure ("lda", Lit i) -// dec (LDC i) = pure ("ldc", Lit i) -// dec (LDH i) = pure ("ldh", Lit i) -// dec (LDL i) = pure ("ldl", Lit i) -// dec (LDR i) = pure ("ldr", Lit i) -// dec (LDS i) = pure ("lds", Lit i) -// dec _ = liftT (Left $ Error "PANIC: trying to load non adres") -// -////Instruction (String), key of function to jump to -//jump :: String String -> Gen Instr -//jump instr k = genMap >>= \g-> case 'Map'.member k g of -// False = liftT (Left $ Error $ concat ["PANIC: ", k, " not found as function"]) -// True = dec ('Map'.find k g) >>= \lbl-> pure $ Instr instr [lbl] (k +++"()") -//where -// dec (FUNC l) = pure (L l) -// dec _ = liftT (Left $ Error "PANIC: trying to jump to non label") class print a :: a -> [String]