|
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)
|