return dingen en local vars werken
authorMart Lubbers <mart@martlubbers.net>
Thu, 19 May 2016 14:35:25 +0000 (16:35 +0200)
committerMart Lubbers <mart@martlubbers.net>
Thu, 19 May 2016 14:35:25 +0000 (16:35 +0200)
examples/codeGen.spl
gen.icl

index 9982b4b..5b366ba 100644 (file)
@@ -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 (file)
--- 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]