1 -- simple conversions
    2 
    3 module FAconv 
    4 
    5 ( etnfa2tnfa, tnfa2etnfa
    6 , tnfa2bnfa, bnfa2tnfa
    7 , bdfa2bnfa, simplebnfa2bdfa
    8 , bdfa2tnfa
    9 )
   10 
   11 where
   12 
   13 import Set
   14 import FiniteMap
   15 
   16 import Stuff 
   17 import Options
   18 
   19 import FAtypes
   20 
   21 import TA
   22 
   23 ---------------------------------------------------------------
   24 
   25 etnfa2tnfa :: (Show a, Ord a) => Opts -> ETNFA a -> TNFA a
   26 etnfa2tnfa opts a @ (ETNFA cons all starts moves eps) =
   27     let ehull x = sethull (\ y -> lookupset eps y) x 
   28         h x = ehull (unitSet x) `bind` lookupset moves
   29         moves1 = listToFM [ (x, h x) | x <- setToList all ]
   30         starts1 = mapSet unitSet starts `bind` ehull
   31         t = TNFA cons all starts1 moves1
   32     in  
   33 --      trace ("etnfa2tnfa.a = " ++ show a) $
   34 --      trace ("etnfa2tnfa.t = " ++ show t) $
   35         t
   36 
   37 --------------------------------------------------------------
   38 
   39 tnfa2bnfa :: Ord a => Opts -> TNFA a -> BNFA a
   40 tnfa2bnfa opts (TNFA cons all starts moves) =
   41     BNFA cons all starts (invert moves)
   42 
   43 
   44 bnfa2tnfa :: Ord a => Opts -> BNFA a -> TNFA a
   45 bnfa2tnfa opts (BNFA cons all starts moves) =
   46     TNFA cons all starts (invert moves)
   47 
   48 tnfa2etnfa :: Ord a => Opts -> TNFA a -> ETNFA a
   49 tnfa2etnfa opts(TNFA cons all starts moves) =
   50     ETNFA cons all starts moves emptyFM
   51 
   52 
   53 
   54 bdfa2bnfa :: Ord a => Opts -> BDFA a -> BNFA a
   55 bdfa2bnfa opts (BDFA cons all starts moves) =
   56     let moves' = mapFM (\ x y -> unitSet y) moves
   57     in  BNFA cons all starts moves'
   58 
   59 
   60 simplebnfa2bdfa opts (BNFA cons all starts moves) =
   61     let moves1 = mapFM ( \ t ws -> 
   62                 case setToList ws of 
   63                         [w] -> w
   64                         _ -> error "simplebnfa2bdfa" ) moves
   65     in  BDFA cons all starts moves1
   66 
   67 -------------------------------------------------------
   68 
   69 bdfa2tnfa :: Opts -> BDFA Int -> TNFA Int
   70 bdfa2tnfa opts = bnfa2tnfa opts . bdfa2bnfa opts
   71