implementation module gen
-
import StdMisc
import StdList
import StdOverloaded
import StdString
-from StdFunc import id
+from StdFunc import id, const
import StdTuple
import StdEnum
-from StdEnv import const
import Data.Func
import qualified Data.Map as Map
import AST
import RWST
-//Instruction is an instruction, with possible arguments and a possible comment
-//Or is a label
TRUE :== -1
FALSE :== 0
:: Instr = Instr String [Arg] String
:: Gen a :== RWST Label SSMProgram (GenMap, [Label]) (Either GenError) a
labelStream :: [Label]
-labelStream = map (\i-> concat ["lbl_", toString i]) [1..]
+labelStream = ["lbl_" +++ toString i\\i<-[1..]]
-gen :: AST -> String
+gen :: AST -> Either String String
gen (AST fds) = case evalRWST prog "" ('Map'.newMap, labelStream) of
- Left (Error e) = e
- Right (_, p) = toString p
+ Left (Error e) = Left e
+ Right (_, p) = Right $ toString p
where
prog = tell [Instr "bra" [L "main"] ""] >>| mapM_ g fds
-//gen _ = prog
-// where
-// expr = (Op2Expr zero (Op1Expr zero UnMinus (IntExpr zero 4)) BiPlus (IntExpr zero 7))
-// expr2 = (FunExpr zero "test" [IntExpr zero 4] [])
-// stmt = (IfStmt (BoolExpr zero True) [] [])
-// prog = case evalRWST (g stmt) 0 ('Map'.newMap, labelStream) of
-// Left (Error e) = abort e
-// Right (_, prog) = toString prog
-//gen _ = toString [Lab "Test"
-// ,Instr "ldc" [Lit 1] "Eerste instructie"
-// ,Instr "ldc" [Lit 2] "Tweede instructie"]
//Current issues:
//All VarDecls are added as function, how to deal with assignments?
//helper functions for the gen monad
genMap :: Gen GenMap
genMap = gets fst
+
changeGenMap :: (GenMap -> GenMap) -> Gen GenMap
changeGenMap f = modify (appFst f) >>| genMap
toString (Raw s) = s
instance toString SSMProgram where
- toString p = concat $ intersperse " " $ map (\i-> concat $ intersperse " " $ print i) p
\ No newline at end of file
+ toString p = concat $ intersperse " " $ map (\i-> concat $ intersperse " " $ print i) p