summaryrefslogtreecommitdiff
path: root/edit-lens/src/Control/DFST.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'edit-lens/src/Control/DFST.lhs')
-rw-r--r--edit-lens/src/Control/DFST.lhs27
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
15import Data.Map.Lazy (Map, (!?)) 16import Data.Map.Lazy (Map, (!?), (!))
16import qualified Data.Map.Lazy as Map 17import qualified Data.Map.Lazy as Map
17 18
18import Data.Set (Set) 19import Data.Set (Set)
@@ -21,6 +22,8 @@ import qualified Data.Set as Set
21import Data.Sequence (Seq(..)) 22import Data.Sequence (Seq(..))
22import qualified Data.Sequence as Seq 23import qualified Data.Sequence as Seq
23 24
25import Data.Bool (bool)
26
24import Data.Monoid 27import Data.Monoid
25 28
26import Numeric.Natural 29import Numeric.Natural
@@ -30,6 +33,8 @@ import Control.Monad.State
30 33
31import Control.FST (FST(FST)) 34import Control.FST (FST(FST))
32import qualified Control.FST as FST 35import qualified Control.FST as FST
36
37import 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}
44data DFST state input output = DFST 53data DFST state input output = DFST
@@ -105,5 +114,21 @@ runDFST' _ st Empty acc = (acc, Just st)
105runDFST' dfst@DFST{..} st (c :<| cs) acc = case stTransition !? (st, c) of 114runDFST' 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
118dotDFST :: forall state input output. (Ord state, Ord input, Ord output, Show state, Show input, Show output) => DFST state input output -> Dot ()
119dotDFST 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}