module Compiler where
import Language
-import Serialise
---
+
import qualified Data.Map as DM
-import Control.Monad.Writer
-import Control.Monad.State
import Control.Monad.ST
---import Debug.Trace
+import Control.Monad.State
+import Control.Monad.Writer
import Data.Array
import Data.Array.ST
import Data.Function
Mul -> bop (*) memory reg >>= int program memory
Div -> bop div memory reg >>= int program memory
Neg -> uop negate memory reg >>= int program memory
- And -> bop ((b2i .) . on (&&) i2b) memory reg >>= int program memory
- Or -> bop ((b2i .) . on (||) i2b) memory reg >>= int program memory
- Not -> uop (b2i . Prelude.not . i2b) memory reg >>= int program memory
- Eq -> bop ((b2i .) . (==)) memory reg >>= int program memory
- Neq -> bop ((b2i .) . (/=)) memory reg >>= int program memory
- Le -> bop ((b2i .) . (<)) memory reg >>= int program memory
- Ge -> bop ((b2i .) . (>)) memory reg >>= int program memory
- Leq -> bop ((b2i .) . (<=)) memory reg >>= int program memory
- Geq -> bop ((b2i .) . (>=)) memory reg >>= int program memory
+ And -> bop ((fromEnum .) . on (&&) toEnum) memory reg >>= int program memory
+ Or -> bop ((fromEnum .) . on (||) toEnum) memory reg >>= int program memory
+ Not -> uop (fromEnum . Prelude.not . toEnum) memory reg >>= int program memory
+ Eq -> bop ((fromEnum .) . (==)) memory reg >>= int program memory
+ Neq -> bop ((fromEnum .) . (/=)) memory reg >>= int program memory
+ Le -> bop ((fromEnum .) . (<)) memory reg >>= int program memory
+ Ge -> bop ((fromEnum .) . (>)) memory reg >>= int program memory
+ Leq -> bop ((fromEnum .) . (<=)) memory reg >>= int program memory
+ Geq -> bop ((fromEnum .) . (>=)) memory reg >>= int program memory
Lbl _ -> int program memory reg
Bra l -> branch l program reg >>= int program memory
Brf l -> do
(reg', v) <- pop memory reg
- reg'' <- if i2b v then pure reg' else branch l program reg'
+ reg'' <- if toEnum v then pure reg' else branch l program reg'
int program memory reg''
Sth n ->
popn memory n reg
_ -> readArray program (pc reg) >>= \case
Lbl l | label == l -> pure $ reg
_ -> branch label program $ reg { pc = pc reg - 1 }
-
-b2i :: Bool -> Int
-b2i True = 1
-b2i False = 0
-
-i2b :: Int -> Bool
-i2b 0 = False
-i2b _ = True