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