Blame src/Info.hs

Packit 2cbdf3
-- -----------------------------------------------------------------------------
Packit 2cbdf3
-- 
Packit 2cbdf3
-- Info.hs, part of Alex
Packit 2cbdf3
--
Packit 2cbdf3
-- (c) Simon Marlow 2003
Packit 2cbdf3
--
Packit 2cbdf3
-- Generate a human-readable rendition of the state machine.
Packit 2cbdf3
--
Packit 2cbdf3
-- ----------------------------------------------------------------------------}
Packit 2cbdf3
Packit 2cbdf3
module Info (infoDFA) where
Packit 2cbdf3
Packit 2cbdf3
import AbsSyn
Packit 2cbdf3
import qualified Map
Packit 2cbdf3
import qualified Data.IntMap as IntMap
Packit 2cbdf3
import Util
Packit 2cbdf3
Packit 2cbdf3
-- -----------------------------------------------------------------------------
Packit 2cbdf3
-- Generate a human readable dump of the state machine
Packit 2cbdf3
Packit 2cbdf3
infoDFA :: Int -> String -> DFA SNum Code -> ShowS
Packit 2cbdf3
infoDFA _ func_nm dfa
Packit 2cbdf3
  = str "Scanner : " . str func_nm . nl
Packit 2cbdf3
  . str "States  : " . shows (length dfa_list) . nl
Packit 2cbdf3
  . nl . infoDFA'
Packit 2cbdf3
  where    
Packit 2cbdf3
    dfa_list = Map.toAscList (dfa_states dfa)
Packit 2cbdf3
Packit 2cbdf3
    infoDFA' = interleave_shows nl (map infoStateN dfa_list)
Packit 2cbdf3
Packit 2cbdf3
    infoStateN (i,s) = str "State " . shows i . nl . infoState s
Packit 2cbdf3
Packit 2cbdf3
    infoState :: State SNum Code -> ShowS
Packit 2cbdf3
    infoState (State accs out)
Packit 2cbdf3
        = foldr (.) id (map infoAccept accs)
Packit 2cbdf3
        . infoArr out . nl
Packit 2cbdf3
Packit 2cbdf3
    infoArr out
Packit 2cbdf3
        = char '\t' . interleave_shows (str "\n\t")
Packit 2cbdf3
                        (map infoTransition (IntMap.toAscList out))
Packit 2cbdf3
Packit 2cbdf3
    infoAccept (Acc p act lctx rctx)
Packit 2cbdf3
        = str "\tAccept" . paren (shows p) . space
Packit 2cbdf3
        . outputLCtx lctx . space
Packit 2cbdf3
        . showRCtx rctx
Packit 2cbdf3
        . (case act of
Packit 2cbdf3
            Nothing   -> id
Packit 2cbdf3
            Just code -> str " { " . str code . str " }")
Packit 2cbdf3
        . nl
Packit 2cbdf3
        
Packit 2cbdf3
    infoTransition (char',state)
Packit 2cbdf3
        = str (ljustify 8 (show char'))
Packit 2cbdf3
        . str " -> "
Packit 2cbdf3
        . shows state
Packit 2cbdf3
Packit 2cbdf3
    outputLCtx Nothing
Packit 2cbdf3
          = id
Packit 2cbdf3
    outputLCtx (Just set)
Packit 2cbdf3
          = paren (show set ++) . char '^'
Packit 2cbdf3
Packit 2cbdf3
    -- outputArr arr
Packit 2cbdf3
          -- = str "Array.array " . shows (bounds arr) . space
Packit 2cbdf3
          -- . shows (assocs arr)