From 9cf71d3bba75f157e72bc08f984a2262885ed506 Mon Sep 17 00:00:00 2001 From: aarne Date: Mon, 20 Jun 2005 15:14:19 +0000 Subject: parse tree visualization --- src/GF/Visualization/VisualizeTree.hs | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/GF/Visualization/VisualizeTree.hs (limited to 'src/GF/Visualization') diff --git a/src/GF/Visualization/VisualizeTree.hs b/src/GF/Visualization/VisualizeTree.hs new file mode 100644 index 000000000..af583567f --- /dev/null +++ b/src/GF/Visualization/VisualizeTree.hs @@ -0,0 +1,53 @@ +---------------------------------------------------------------------- +-- | +-- Module : VisualizeTree +-- Maintainer : AR +-- Stability : (stable) +-- Portability : (portable) +-- +-- > CVS $Date: +-- > CVS $Author: +-- > CVS $Revision: +-- +-- Print a graph of an abstract syntax tree in Graphviz DOT format +-- Based on BB's VisualizeGrammar +----------------------------------------------------------------------------- + +module GF.Visualization.VisualizeTree ( visualizeTrees + ) where + +import GF.Infra.Ident +import GF.Infra.Option +import GF.Grammar.Abstract +import GF.Data.Zipper +import GF.Grammar.PrGrammar + +import Data.List (intersperse, nub) +import Data.Maybe (maybeToList) + +visualizeTrees :: Options -> [Tree] -> String +visualizeTrees opts = unlines . map (prGraph . tree2graph opts) + +tree2graph :: Options -> Tree -> [String] +tree2graph opts = prf (0,0) where + prf (i,j) t@(Tr (node, trees)) = + let nod = prn (i,j) node in + (nod ++ " [style = \"solid\", shape = \"plaintext\"] ;") : + [pra (i+1,j) nod t | (j,t) <- zip [0..] trees] ++ + concat [prf (i+1,j) t | (j,t) <- zip [0..] trees] + prn (i,j) (N (bi,at,val,_,_)) = + "\"" ++ prs i ++ + prb bi ++ + prc at val ++ + prs j ++ "\"" + prb [] = "" + prb bi = "\\" ++ concat (intersperse "," (map (prt_ . fst) bi)) ++ " -> " + pra i nod t@(Tr (node,_)) = nod ++ " -- " ++ prn i node ++ " [style = \"solid\"];" + + prs k = if oElem (iOpt "g") opts then "" else replicate k ' ' + prc a v + | oElem (iOpt "c") opts = prt_ v + | oElem (iOpt "f") opts = prt_ a + | otherwise = prt_ a ++ " : " ++ prt_ v + +prGraph ns = concat $ map (++"\n") $ ["graph {\n"] ++ ns ++ ["}"] -- cgit v1.2.3