pure (head vars)
class g a :: a -> Gen ()
-//
+
instance g Op1 where
g UnNegation = tell [Instr "not" [] ""]
g UnMinus = tell [Instr "neg" [] ""]
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]