tlex-debug-0.1.0.0: src/Language/Lexer/Tlex/Plugin/Debug/Graphviz.hs
module Language.Lexer.Tlex.Plugin.Debug.Graphviz (
NodeShape (..),
Node (..),
Edge (..),
Ast (..),
outputAst,
) where
import Language.Lexer.Tlex.Prelude
import qualified Prelude
data NodeShape
= DoubleCircle
| Circle
deriving (Eq, Show, Ord, Enum)
type NodeId = Prelude.String
data Node = Node
{ nodeId :: NodeId
, nodeLabel :: Maybe Prelude.String
, nodeShape :: Maybe NodeShape
}
deriving (Eq, Show)
data Edge = Edge
{ edgeFrom :: NodeId
, edgeTo :: NodeId
, edgeLabel :: Maybe Prelude.String
}
deriving (Eq, Show)
data Ast = Ast
{ nodes :: [Node]
, edges :: [Edge]
}
deriving (Eq, Show)
outputAst :: Ast -> Prelude.String
outputAst ast =
"digraph {\n" ++
nodeDef ++
edgeDef ++
"}"
where
nodeDef = concatMap
do \n ->
nodeId n ++
" [" ++
do case nodeLabel n of
Just lb -> "label = \"" ++ lb ++ "\","
Nothing -> ""
++
do case nodeShape n of
Nothing -> ""
Just sh ->
"shape = " ++
do case sh of
DoubleCircle -> "doublecircle"
Circle -> "circle"
++
","
++
"];\n"
do nodes ast
edgeDef = concatMap
do \e ->
edgeFrom e ++
" -> " ++
edgeTo e ++
" [" ++
do case edgeLabel e of
Just lb -> "label = \"" ++ lb ++ "\","
Nothing -> ""
++
"];\n"
do edges ast