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