never executed always true always false
1 module HelVM.HelMA.Automata.BrainFuck.Evaluator where
2
3 import qualified HelVM.HelMA.Automata.BrainFuck.Impl.Fast.Evaluator as Fast
4 import qualified HelVM.HelMA.Automata.BrainFuck.Impl.Fast.Parser as Fast
5 import qualified HelVM.HelMA.Automata.BrainFuck.Impl.Flat.Evaluator as Flat
6 import qualified HelVM.HelMA.Automata.BrainFuck.Impl.Flat.Parser as Flat
7 import qualified HelVM.HelMA.Automata.BrainFuck.Impl.Tree.Evaluator as Tree
8 import qualified HelVM.HelMA.Automata.BrainFuck.Impl.Tree.Parser as Tree
9
10
11 import HelVM.HelMA.Automata.BrainFuck.API.ImplType
12
13 import HelVM.HelMA.Automata.BrainFuck.Common.Symbol
14 import HelVM.HelMA.Automata.BrainFuck.Common.TapeOfSymbols
15
16 import qualified HelVM.HelMA.Automaton.API.AppOptions as App
17 import qualified HelVM.HelMA.Automaton.API.Emit as Emit
18 import HelVM.HelMA.Automaton.API.Env
19
20 import HelVM.HelMA.Automaton.API.EvalParams
21 import HelVM.HelMA.Automaton.API.IOTypes
22
23 import HelVM.HelMA.Automaton.Eff.MonadEff
24
25 import HelVM.HelMA.Automaton.Extra
26
27 import HelVM.HelMA.Automaton.Types.CellType
28 import HelVM.HelMA.Automaton.Types.DumpType
29
30 import qualified RIO
31
32 import Text.Pretty.Simple
33
34 runRio :: Has env => ImplType -> RIO.RIO env ()
35 runRio t = runWithOptions =<< optionsRio where
36 runWithOptions o = run (App.emit o) t . App.evalParams o =<< readSourceFileRio
37
38 run :: Has env => Emit.Emit -> ImplType -> EvalParams -> RIO.RIO env ()
39 run Emit.No i = runAsRIO . evalParams i
40 run Emit.IL FastType = putLTextLnRio . pShowNoColor . Fast.parseAsListSafe . source
41 run Emit.IL TreeType = putLTextLnRio . pShowNoColor . Tree.parseAsVectorSafe . source
42 run _ _ = putLTextLnRio . show . Flat.readTokens . source
43
44 simpleEval :: AppEff m => (ImplType , Source , CellType) -> m ()
45 simpleEval (c , s , t) = eval c s t Pretty --TODO Add MaybeLimit and use Trampoline
46
47 ----
48
49 evalParams :: AppEff m => ImplType -> EvalParams -> m ()
50 evalParams b p = eval b (source p) (cellAutoOptions p) (dumpAutoOptions p)
51
52 eval :: AppEff m => ImplType -> Source -> CellType -> DumpType -> m ()
53 eval c s Int8Type = evalSource c s (newTape :: FullTape Int8)
54 eval c s Word8Type = evalSource c s (newTape :: FullTape Word8)
55 eval c s Int16Type = evalSource c s (newTape :: FullTape Int16)
56 eval c s Word16Type = evalSource c s (newTape :: FullTape Word16)
57 eval c s Int32Type = evalSource c s (newTape :: FullTape Int32)
58 eval c s Word32Type = evalSource c s (newTape :: FullTape Word32)
59 eval c s Int64Type = evalSource c s (newTape :: FullTape Int64)
60 eval c s Word64Type = evalSource c s (newTape :: FullTape Word64)
61
62 evalSource :: (AppEff m , Symbol e) => ImplType -> Source -> FullTape e -> DumpType -> m ()
63 evalSource FastType = Fast.evalSource
64 evalSource TreeType = Tree.evalSource
65 evalSource FlatType = Flat.evalSource