packages feed

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