mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-24 03:52:50 -06:00
Added visualization of source modules.
This commit is contained in:
@@ -41,6 +41,7 @@ import Operations
|
|||||||
import UseIO
|
import UseIO
|
||||||
import UTF8 (encodeUTF8)
|
import UTF8 (encodeUTF8)
|
||||||
|
|
||||||
|
import VisualizeGrammar (visualizeSourceGrammar)
|
||||||
|
|
||||||
---- import qualified GrammarToGramlet as Gr
|
---- import qualified GrammarToGramlet as Gr
|
||||||
---- import qualified GrammarToCanonXML2 as Canon
|
---- import qualified GrammarToCanonXML2 as Canon
|
||||||
@@ -228,6 +229,8 @@ execC co@(comm, opts0) sa@((st,(h,_)),a) = checkOptions st co >> case comm of
|
|||||||
CPrintMultiGrammar -> do
|
CPrintMultiGrammar -> do
|
||||||
sa' <- changeState purgeShellState sa
|
sa' <- changeState purgeShellState sa
|
||||||
returnArg (AString (optPrintMultiGrammar opts cgr)) sa'
|
returnArg (AString (optPrintMultiGrammar opts cgr)) sa'
|
||||||
|
CPrintSourceGrammar ->
|
||||||
|
returnArg (AString (visualizeSourceGrammar src)) sa
|
||||||
|
|
||||||
---- CPrintGramlet -> returnArg (AString (Gr.prGramlet st)) sa
|
---- CPrintGramlet -> returnArg (AString (Gr.prGramlet st)) sa
|
||||||
---- CPrintCanonXML -> returnArg (AString (Canon.prCanonXML st False)) sa
|
---- CPrintCanonXML -> returnArg (AString (Canon.prCanonXML st False)) sa
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ pCommand ws = case ws of
|
|||||||
"pxs" : [] -> aUnit CPrintCanonXMLStruct
|
"pxs" : [] -> aUnit CPrintCanonXMLStruct
|
||||||
"px" : [] -> aUnit CPrintCanonXML
|
"px" : [] -> aUnit CPrintCanonXML
|
||||||
"pm" : [] -> aUnit CPrintMultiGrammar
|
"pm" : [] -> aUnit CPrintMultiGrammar
|
||||||
|
"sg" : [] -> aUnit CPrintSourceGrammar
|
||||||
"po" : [] -> aUnit CPrintGlobalOptions
|
"po" : [] -> aUnit CPrintGlobalOptions
|
||||||
"pl" : [] -> aUnit CPrintLanguages
|
"pl" : [] -> aUnit CPrintLanguages
|
||||||
"h" : c : [] -> aUnit $ CHelp (Just (abbrevCommand c))
|
"h" : c : [] -> aUnit $ CHelp (Just (abbrevCommand c))
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ data Command =
|
|||||||
| CPrintLanguages
|
| CPrintLanguages
|
||||||
| CPrintInformation I.Ident
|
| CPrintInformation I.Ident
|
||||||
| CPrintMultiGrammar
|
| CPrintMultiGrammar
|
||||||
|
| CPrintSourceGrammar
|
||||||
| CPrintGramlet
|
| CPrintGramlet
|
||||||
| CPrintCanonXML
|
| CPrintCanonXML
|
||||||
| CPrintCanonXMLStruct
|
| CPrintCanonXMLStruct
|
||||||
@@ -166,6 +167,7 @@ optionsOfCommand co = case co of
|
|||||||
|
|
||||||
CPrintGrammar -> both "utf8" "printer lang"
|
CPrintGrammar -> both "utf8" "printer lang"
|
||||||
CPrintMultiGrammar -> both "utf8" "printer"
|
CPrintMultiGrammar -> both "utf8" "printer"
|
||||||
|
CPrintSourceGrammar -> both "utf8" "printer"
|
||||||
|
|
||||||
CHelp _ -> opts "all filter length lexer unlexer printer transform depth number"
|
CHelp _ -> opts "all filter length lexer unlexer printer transform depth number"
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ import qualified PrintParser as Prt
|
|||||||
import GFC
|
import GFC
|
||||||
import qualified MkGFC as MC
|
import qualified MkGFC as MC
|
||||||
import PrintCFGrammar (prCanonAsCFGM)
|
import PrintCFGrammar (prCanonAsCFGM)
|
||||||
import VisualizeGrammar (visualizeGrammar)
|
import VisualizeGrammar (visualizeCanonGrammar, visualizeSourceGrammar)
|
||||||
|
|
||||||
import MyParser
|
import MyParser
|
||||||
|
|
||||||
@@ -230,7 +230,7 @@ customMultiGrammarPrinter =
|
|||||||
(strCI "gfcm", MC.prCanon)
|
(strCI "gfcm", MC.prCanon)
|
||||||
,(strCI "header", MC.prCanonMGr)
|
,(strCI "header", MC.prCanonMGr)
|
||||||
,(strCI "cfgm", prCanonAsCFGM)
|
,(strCI "cfgm", prCanonAsCFGM)
|
||||||
,(strCI "graph", visualizeGrammar)
|
,(strCI "graph", visualizeCanonGrammar)
|
||||||
]
|
]
|
||||||
++ moreCustomMultiGrammarPrinter
|
++ moreCustomMultiGrammarPrinter
|
||||||
|
|
||||||
|
|||||||
@@ -4,15 +4,21 @@ module VisualizeGrammar where
|
|||||||
import qualified Modules as M
|
import qualified Modules as M
|
||||||
import GFC
|
import GFC
|
||||||
import Ident
|
import Ident
|
||||||
|
import Grammar (SourceGrammar)
|
||||||
|
|
||||||
import Data.List (intersperse)
|
import Data.List (intersperse, nub)
|
||||||
import Data.Maybe (maybeToList)
|
import Data.Maybe (maybeToList)
|
||||||
|
|
||||||
data GrType = GrAbstract | GrConcrete | GrResource
|
data GrType = GrAbstract
|
||||||
|
| GrConcrete
|
||||||
|
| GrResource
|
||||||
|
| GrInterface
|
||||||
|
| GrInstance
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
data Node = Node {
|
data Node = Node {
|
||||||
label :: String,
|
label :: String,
|
||||||
|
url :: String,
|
||||||
grtype :: GrType,
|
grtype :: GrType,
|
||||||
extends :: [String],
|
extends :: [String],
|
||||||
opens :: [String],
|
opens :: [String],
|
||||||
@@ -21,28 +27,40 @@ data Node = Node {
|
|||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
|
|
||||||
visualizeGrammar :: CanonGrammar -> String
|
visualizeCanonGrammar :: CanonGrammar -> String
|
||||||
visualizeGrammar gr = prGraph ns
|
visualizeCanonGrammar = prGraph . canon2graph
|
||||||
where
|
|
||||||
ns = [ toNode i m | (i,M.ModMod m) <- M.modules gr ]
|
|
||||||
|
|
||||||
toNode :: Ident -> M.Module Ident f Info -> Node
|
visualizeSourceGrammar :: SourceGrammar -> String
|
||||||
|
visualizeSourceGrammar = prGraph . source2graph
|
||||||
|
|
||||||
|
canon2graph :: CanonGrammar -> [Node]
|
||||||
|
canon2graph gr = [ toNode i m | (i,M.ModMod m) <- M.modules gr ]
|
||||||
|
|
||||||
|
source2graph :: SourceGrammar -> [Node]
|
||||||
|
source2graph gr = [ toNode i m | (i,M.ModMod m) <- M.modules gr ] -- FIXME: handle ModWith
|
||||||
|
|
||||||
|
toNode :: Ident -> M.Module Ident f i -> Node
|
||||||
toNode i m = Node {
|
toNode i m = Node {
|
||||||
label = prIdent i,
|
label = l,
|
||||||
|
url = l ++ ".gf", -- FIXME: might be in a different directory
|
||||||
grtype = t,
|
grtype = t,
|
||||||
extends = map prIdent (M.extends m),
|
extends = map prIdent (M.extends m),
|
||||||
opens = map openName (M.opens m),
|
opens = nub $ map openName (M.opens m), -- FIXME: nub is needed because of triple open with
|
||||||
|
-- instance modules
|
||||||
implements = is
|
implements = is
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
|
l = prIdent i
|
||||||
(t,is) = case M.mtype m of
|
(t,is) = case M.mtype m of
|
||||||
M.MTAbstract -> (GrAbstract, Nothing)
|
M.MTAbstract -> (GrAbstract, Nothing)
|
||||||
|
M.MTTransfer _ _ -> error "Can't visualize transfer modules yet" -- FIXME
|
||||||
M.MTConcrete i -> (GrConcrete, Just (prIdent i))
|
M.MTConcrete i -> (GrConcrete, Just (prIdent i))
|
||||||
M.MTResource -> (GrResource, Nothing)
|
M.MTResource -> (GrResource, Nothing)
|
||||||
M.MTTransfer _ _ ->
|
M.MTInterface -> (GrInterface, Nothing)
|
||||||
-- FIXME
|
M.MTInstance i -> (GrInstance, Just (prIdent i))
|
||||||
error "Can't visualize transfer modules yet"
|
M.MTReuse rt -> error "Can't visualize reuse modules yet" -- FIXME
|
||||||
|
M.MTUnion _ _ -> error "Can't visualize union modules yet" -- FIXME
|
||||||
|
|
||||||
openName :: M.OpenSpec Ident -> String
|
openName :: M.OpenSpec Ident -> String
|
||||||
openName (M.OSimple q i) = prIdent i
|
openName (M.OSimple q i) = prIdent i
|
||||||
openName (M.OQualif q i _) = prIdent i
|
openName (M.OQualif q i _) = prIdent i
|
||||||
@@ -54,25 +72,28 @@ prNode :: Node -> String
|
|||||||
prNode n = concat (map (++";\n") stmts)
|
prNode n = concat (map (++";\n") stmts)
|
||||||
where
|
where
|
||||||
l = label n
|
l = label n
|
||||||
|
t = grtype n
|
||||||
stmts = [l ++ " [" ++ prAttributes attrs ++ "]"]
|
stmts = [l ++ " [" ++ prAttributes attrs ++ "]"]
|
||||||
++ map (prExtend l) (extends n)
|
++ map (prExtend t l) (extends n)
|
||||||
++ map (prOpen l) (opens n)
|
++ map (prOpen l) (opens n)
|
||||||
++ map (prImplement l) (maybeToList (implements n))
|
++ map (prImplement t l) (maybeToList (implements n))
|
||||||
style = case grtype n of
|
(shape,style) = case t of
|
||||||
GrAbstract -> "solid"
|
GrAbstract -> ("ellipse","solid")
|
||||||
GrConcrete -> "dashed"
|
GrConcrete -> ("box","dashed")
|
||||||
GrResource -> "dotted"
|
GrResource -> ("ellipse","dashed")
|
||||||
attrs = [("style",style),("URL", l++".gf")] -- FIXME: might be in a different directory
|
GrInterface -> ("ellipse","dotted")
|
||||||
|
GrInstance -> ("diamond","dotted")
|
||||||
|
attrs = [("style", style),("shape", shape),("URL", url n)]
|
||||||
|
|
||||||
|
|
||||||
prExtend :: String -> String -> String
|
prExtend :: GrType -> String -> String -> String
|
||||||
prExtend f t = prEdge f t []
|
prExtend g f t = prEdge f t [("style","solid")]
|
||||||
|
|
||||||
prOpen :: String -> String -> String
|
prOpen :: String -> String -> String
|
||||||
prOpen f t = prEdge f t [("style","dotted")]
|
prOpen f t = prEdge f t [("style","dotted")]
|
||||||
|
|
||||||
prImplement :: String -> String -> String
|
prImplement :: GrType -> String -> String -> String
|
||||||
prImplement f t = prEdge f t [("arrowhead","empty"),("style","dashed")]
|
prImplement g f t = prEdge f t [("arrowhead","empty"),("style","dashed")]
|
||||||
|
|
||||||
prEdge :: String -> String -> [(String,String)] -> String
|
prEdge :: String -> String -> [(String,String)] -> String
|
||||||
prEdge f t as = f ++ " -> " ++ t ++ " [" ++ prAttributes as ++ "]"
|
prEdge f t as = f ++ " -> " ++ t ++ " [" ++ prAttributes as ++ "]"
|
||||||
|
|||||||
Reference in New Issue
Block a user