1 module Exp2FA 2 3 ( grammar2etnfa 4 ) 5 6 where 7 8 import Set 9 import FiniteMap 10 11 import Grammar 12 13 import TA 14 import FAtypes 15 16 import Stuff 17 import Options 18 19 import Ids 20 21 ------------------------------------------------------------------------ 22 23 grammar2etnfa :: (Show a, Ord a) => Opts -> Grammar a -> ETNFA a 24 grammar2etnfa opts (start, rules) = 25 let 26 all = unionManySets ( unitSet start 27 : [ mkSet (v : stargs t) | (v, Right t) <- rules ] 28 ++ [ mkSet (v : [w]) | (v, Left w ) <- rules ] ) 29 moves = addListToFM_C unionSet emptyFM 30 [ (v, unitSet t) | (v, Right t) <- rules ] 31 eps = addListToFM_C unionSet emptyFM 32 [ (v, unitSet w) | (v, Left w) <- rules ] 33 cons = mkSet [ stcon t | (v, Right t) <- rules ] 34 e = ETNFA cons all (unitSet start) moves eps 35 in 36 37 -- trace ("\ngrammar2etnfa.e = " ++ show e) $ 38 39 e