never executed always true always false
1 module HelVM.HelMA.Automata.ETA.Evaluator (
2 runRio,
3 run,
4 simpleEval,
5 evalParams,
6 ) where
7
8 import HelVM.HelMA.Automata.ETA.API.AutomatonType
9
10 import HelVM.HelMA.Automata.ETA.Automaton
11 import HelVM.HelMA.Automata.ETA.Lexer
12 import HelVM.HelMA.Automata.ETA.Optimizer
13 import HelVM.HelMA.Automata.ETA.Parser
14 import qualified HelVM.HelMA.Automata.ETA.SimpleParams as S
15 import HelVM.HelMA.Automata.ETA.Symbol
16 import HelVM.HelMA.Automata.ETA.Token
17
18
19 import qualified HelVM.HelMA.Automaton.API.AppOptions as App
20 import qualified HelVM.HelMA.Automaton.API.AutomatonOptions as Automaton
21 import HelVM.HelMA.Automaton.API.AutoOptions
22 import qualified HelVM.HelMA.Automaton.API.Emit as Emit
23 import HelVM.HelMA.Automaton.API.Env
24 import HelVM.HelMA.Automaton.API.EvalParams
25 import HelVM.HelMA.Automaton.API.IOTypes
26
27 import qualified HelVM.HelMA.Automaton.Automaton as Automaton
28
29 import HelVM.HelMA.Automaton.Eff.AutomatonEff
30 import HelVM.HelMA.Automaton.Eff.MonadEff
31
32 import HelVM.HelMA.Automaton.Extra
33
34 import HelVM.HelMA.Automaton.Types.DumpType
35 import HelVM.HelMA.Automaton.Types.StackType
36
37 import HelVM.HelIO.Collections.SList as SList
38
39 import qualified Data.Sequence as Seq
40
41 import Prelude hiding (divMod)
42
43 import qualified RIO
44
45 import Text.Pretty.Simple
46
47 runRio :: Has env => AutomatonType -> RIO.RIO env ()
48 runRio i = runWIthOptions =<< optionsRio where
49 runWIthOptions o = run (App.emit o) i . App.evalParams o =<< readSourceFileRio
50
51 run :: Has env => Emit.Emit -> AutomatonType -> EvalParams -> RIO.RIO env ()
52 run Emit.No i = runAsRIO . evalParams i
53 run Emit.IL _ = putLTextLnRio . pShowNoColor . parseSafe . source
54 run Emit.TL _ = putLTextLnRio . show . tokenize . source
55 run Emit.Code _ = putLTextLnRio . show . readTokens . source
56
57 simpleEval :: AppEff m => S.SimpleParams -> m ()
58 simpleEval p = evalSource (S.implType p) (S.source p) (S.stackType p) (S.autoOptions p)
59
60 ----
61
62 evalParams :: AppEff m => AutomatonType -> EvalParams -> m ()
63 evalParams e p = evalSource e (source p) (stackAutoOptions p) (autoOptions p)
64
65 evalSource :: (AutomatonEff Symbol m) => AutomatonType -> Source -> StackType -> AutoOptions -> m ()
66 evalSource automatonType source = evalTL automatonType (tokenize source)
67
68 evalTL :: (AutomatonEff Symbol m) => AutomatonType -> TokenList -> StackType -> AutoOptions -> m ()
69 evalTL Fast = fastEval
70 evalTL Original = originalEval
71
72 fastEval :: (AutomatonEff Symbol m) => TokenList -> StackType -> AutoOptions -> m ()
73 fastEval tl s a = flip Automaton.start (Automaton.withDefaultRam s a) =<< optimize tl
74
75 originalEval :: (AutomatonEff Symbol m) => TokenList -> StackType -> AutoOptions -> m ()
76 originalEval tl ListStackType = eval tl []
77 originalEval tl SeqStackType = eval tl Seq.empty
78 originalEval tl SListStackType = eval tl SList.sListEmpty
79
80 eval :: (SAutomatonEff Symbol s m) => TokenList -> s -> AutoOptions -> m ()
81 eval tl s (AutoOptions _ limit dt) = logDump dt =<< runAutomat limit (newMemory tl s)