0 | module Text.ILex.Internal.ENFA
 1 |
 2 | import Data.Array.Core
 3 | import Data.Array.Mutable
 4 | import Data.Linear.Traverse1
 5 | import Syntax.T1
 6 | import Text.ILex.Internal.Types
 7 | import Text.ILex.RExp
 8 |
 9 | %default total
10 |
11 | --------------------------------------------------------------------------------
12 | -- Conversion to ENFA
13 | --------------------------------------------------------------------------------
14 |
15 | parameters {auto st : DFAState s a}
16 |   enfa : RExp8 b -> (tgt : Nat) -> F1 s Nat
17 |   enfa Eps       tgt = pure tgt
18 |   enfa (And x y) tgt = enfa y tgt >>= enfa x
19 |   enfa (Ch x)    tgt = createENode (EN [] [] $ map (`E` tgt) $ ranges x)
20 |   enfa (Or x y)  tgt = T1.do
21 |     tx <- enfa x tgt
22 |     ty <- enfa y tgt
23 |     createENode (EN [] [tx,ty] [])
24 |
25 |   enfa (Star x)  tgt = do
26 |     me <- inc
27 |     tx <- enfa x me
28 |     insertENode me (EN [] [tx,tgt] [])
29 |
30 | --------------------------------------------------------------------------------
31 | -- API
32 | --------------------------------------------------------------------------------
33 |
34 |   ||| Compiles an expression to a graph with epsilon transitions
35 |   export
36 |   toENFA : TokenMap8 a -> F1' s
37 |   toENFA rs = T1.do
38 |     ps <- traverse1 (\x => (,x) <$> inc) rs
39 |     traverse1_ insertTerminal ps
40 |     ts <- traverse1 (\(n,r,c) => enfa r n) ps
41 |     ignore1 $ insertENode 0 (EN [] ts [])
42 |
43 |   export %inline
44 |   debugENFA : TokenMap8 a -> F1 s (List (Nat, ENode))
45 |   debugENFA ts = toENFA ts >> pairs1 st.egraph
46 |