diff options
Diffstat (limited to 'edit-lens/src/Control/DFST.lhs')
-rw-r--r-- | edit-lens/src/Control/DFST.lhs | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/edit-lens/src/Control/DFST.lhs b/edit-lens/src/Control/DFST.lhs index 6e16c74..271a13e 100644 --- a/edit-lens/src/Control/DFST.lhs +++ b/edit-lens/src/Control/DFST.lhs | |||
@@ -10,9 +10,10 @@ module Control.DFST | |||
10 | ( DFST(..) | 10 | ( DFST(..) |
11 | , runDFST, runDFST' | 11 | , runDFST, runDFST' |
12 | , toFST | 12 | , toFST |
13 | , dotDFST | ||
13 | ) where | 14 | ) where |
14 | 15 | ||
15 | import Data.Map.Lazy (Map, (!?)) | 16 | import Data.Map.Lazy (Map, (!?), (!)) |
16 | import qualified Data.Map.Lazy as Map | 17 | import qualified Data.Map.Lazy as Map |
17 | 18 | ||
18 | import Data.Set (Set) | 19 | import Data.Set (Set) |
@@ -21,6 +22,8 @@ import qualified Data.Set as Set | |||
21 | import Data.Sequence (Seq(..)) | 22 | import Data.Sequence (Seq(..)) |
22 | import qualified Data.Sequence as Seq | 23 | import qualified Data.Sequence as Seq |
23 | 24 | ||
25 | import Data.Bool (bool) | ||
26 | |||
24 | import Data.Monoid | 27 | import Data.Monoid |
25 | 28 | ||
26 | import Numeric.Natural | 29 | import Numeric.Natural |
@@ -30,6 +33,8 @@ import Control.Monad.State | |||
30 | 33 | ||
31 | import Control.FST (FST(FST)) | 34 | import Control.FST (FST(FST)) |
32 | import qualified Control.FST as FST | 35 | import qualified Control.FST as FST |
36 | |||
37 | import Text.Dot | ||
33 | \end{code} | 38 | \end{code} |
34 | \end{comment} | 39 | \end{comment} |
35 | 40 | ||
@@ -39,6 +44,10 @@ import qualified Control.FST as FST | |||
39 | Zusätzlich ändern wir die Darstellung indem wir $\epsilon$-Transitionen kontrahieren. | 44 | Zusätzlich ändern wir die Darstellung indem wir $\epsilon$-Transitionen kontrahieren. |
40 | Wir erweitern hierfür die Ausgabe pro Transition von einem einzelnen Zeichen zu einem Wort beliebiger Länge und fügen, bei jeder Kontraktion einer $\epsilon$-Transition $A \rightarrow B$, die Ausgabe der Transition vorne an die Ausgabe aller Transitionen $B \rightarrow \ast$ von $B$ an. | 45 | Wir erweitern hierfür die Ausgabe pro Transition von einem einzelnen Zeichen zu einem Wort beliebiger Länge und fügen, bei jeder Kontraktion einer $\epsilon$-Transition $A \rightarrow B$, die Ausgabe der Transition vorne an die Ausgabe aller Transitionen $B \rightarrow \ast$ von $B$ an. |
41 | \end{defn} | 46 | \end{defn} |
47 | |||
48 | \begin{rem} | ||
49 | Die FSTs aus den bisherigen Beispielen \ref{eg:linebreak}, \ref{eg:w100}, \ref{eg:l80timesw100} sind deterministisch. | ||
50 | \end{rem} | ||
42 | 51 | ||
43 | \begin{code} | 52 | \begin{code} |
44 | data DFST state input output = DFST | 53 | data DFST state input output = DFST |
@@ -105,5 +114,21 @@ runDFST' _ st Empty acc = (acc, Just st) | |||
105 | runDFST' dfst@DFST{..} st (c :<| cs) acc = case stTransition !? (st, c) of | 114 | runDFST' dfst@DFST{..} st (c :<| cs) acc = case stTransition !? (st, c) of |
106 | Just (st', mc') -> runDFST' dfst st' cs $ acc <> mc' | 115 | Just (st', mc') -> runDFST' dfst st' cs $ acc <> mc' |
107 | Nothing -> (acc, Nothing) | 116 | Nothing -> (acc, Nothing) |
117 | |||
118 | dotDFST :: forall state input output. (Ord state, Ord input, Ord output, Show state, Show input, Show output) => DFST state input output -> Dot () | ||
119 | dotDFST DFST{..} = do | ||
120 | let | ||
121 | stTransition' = Map.toList stTransition | ||
122 | states = Set.singleton stInitial <> stAccept <> foldMap (Set.singleton . fst . fst) stTransition' <> foldMap (Set.singleton . fst . snd) stTransition' | ||
123 | stateIds <- sequence . (flip Map.fromSet) states $ \st -> node | ||
124 | [ ("label", show st) | ||
125 | , ("peripheries", bool "1" "2" $ st `Set.member` stAccept) | ||
126 | ] | ||
127 | init <- node [ ("label", ""), ("shape", "none") ] | ||
128 | init .->. (stateIds ! stInitial) | ||
129 | forM_ stTransition' $ \((f, inS), (t, outS)) -> do | ||
130 | edge (stateIds ! f) (stateIds ! t) | ||
131 | [ ("label", show (inS, outS)) | ||
132 | ] | ||
108 | \end{code} | 133 | \end{code} |
109 | \end{comment} | 134 | \end{comment} |