added -nofun and -nocat options to vt

This commit is contained in:
aarne
2008-06-22 14:15:06 +00:00
parent 0f0e65f706
commit 0a43025bbe
4 changed files with 30 additions and 34 deletions

View File

@@ -165,8 +165,8 @@ allCommands pgf = Map.fromList [
synopsis = "generates a list of trees, by default exhaustive", synopsis = "generates a list of trees, by default exhaustive",
explanation = unlines [ explanation = unlines [
"Generates all trees of a given category, with increasing depth.", "Generates all trees of a given category, with increasing depth.",
"By default, the depth is inlimited, but this can be changed by a flag." "By default, the depth is 4, but this can be changed by a flag."
---- "If a Tree argument is given, thecommand completes the Tree with values", ---- "If a Tree argument is given, the command completes the Tree with values",
---- "to the metavariables in the tree." ---- "to the metavariables in the tree."
], ],
flags = [ flags = [
@@ -177,7 +177,7 @@ allCommands pgf = Map.fromList [
], ],
exec = \opts _ -> do exec = \opts _ -> do
let pgfr = optRestricted opts let pgfr = optRestricted opts
let dp = return $ valIntOpts "depth" 999999 opts let dp = return $ valIntOpts "depth" 4 opts
let ts = generateAllDepth pgfr (optCat opts) dp let ts = generateAllDepth pgfr (optCat opts) dp
return $ fromTrees $ take (optNumInf opts) ts return $ fromTrees $ take (optNumInf opts) ts
}), }),
@@ -449,7 +449,9 @@ allCommands pgf = Map.fromList [
"flag -format." "flag -format."
], ],
exec = \opts ts -> do exec = \opts ts -> do
let grph = visualizeTrees False ts -- True=digraph let funs = not (isOpt "nofun" opts)
let cats = not (isOpt "nocat" opts)
let grph = visualizeTrees pgf (funs,cats) ts -- True=digraph
if isFlag "view" opts || isFlag "format" opts then do if isFlag "view" opts || isFlag "format" opts then do
let file s = "_grph." ++ s let file s = "_grph." ++ s
let view = optViewGraph opts ++ " " let view = optViewGraph opts ++ " "
@@ -463,7 +465,10 @@ allCommands pgf = Map.fromList [
"p \"hello\" | vt -- parse a string and show trees as graph script", "p \"hello\" | vt -- parse a string and show trees as graph script",
"p \"hello\" | vt -view=\"open\" -- parse a string and display trees on a Mac" "p \"hello\" | vt -view=\"open\" -- parse a string and display trees on a Mac"
], ],
options = [
("nofun","don't show functions but only categories"),
("nocat","don't show categories but only functions")
],
flags = [ flags = [
("format","format of the visualization file (default \"ps\")"), ("format","format of the visualization file (default \"ps\")"),
("view","program to open the resulting file (default \"gv\")") ("view","program to open the resulting file (default \"gv\")")

View File

@@ -684,7 +684,7 @@ transDDecl x = case x of
DDDec binds exp -> transDecl $ DDec binds exp DDDec binds exp -> transDecl $ DDec binds exp
DDExp exp -> transDecl $ DExp exp DDExp exp -> transDecl $ DExp exp
-- | to deal with the old format, sort judgements in three modules, forming -- | to deal with the old format, sort judgements in two modules, forming
-- their names from a given string, e.g. file name or overriding user-given string -- their names from a given string, e.g. file name or overriding user-given string
transOldGrammar :: Options -> FilePath -> OldGrammar -> Err G.SourceGrammar transOldGrammar :: Options -> FilePath -> OldGrammar -> Err G.SourceGrammar
transOldGrammar opts name0 x = case x of transOldGrammar opts name0 x = case x of
@@ -693,7 +693,7 @@ transOldGrammar opts name0 x = case x of
g1 <- transGrammar $ Gr moddefs g1 <- transGrammar $ Gr moddefs
removeLiT g1 --- needed for bw compatibility with an obsolete feature removeLiT g1 --- needed for bw compatibility with an obsolete feature
where where
sortTopDefs ds = [mkAbs a,mkRes ops r,mkCnc ops c] ++ map mkPack ps sortTopDefs ds = [mkAbs a, mkCnc ops (c ++ r)]
where where
ops = map fst ps ops = map fst ps
(a,r,c,ps) = foldr srt ([],[],[],[]) ds (a,r,c,ps) = foldr srt ([],[],[],[]) ds
@@ -714,14 +714,10 @@ transOldGrammar opts name0 x = case x of
DefPrintCat printdefs -> (a,r,d:c,ps) DefPrintCat printdefs -> (a,r,d:c,ps)
DefPrintFun printdefs -> (a,r,d:c,ps) DefPrintFun printdefs -> (a,r,d:c,ps)
DefPrintOld printdefs -> (a,r,d:c,ps) DefPrintOld printdefs -> (a,r,d:c,ps)
DefPackage m ds -> (a,r,c,(m,ds):ps) -- DefPackage m ds -> (a,r,c,(m,ds):ps) -- OBSOLETE
_ -> (a,r,c,ps) _ -> (a,r,c,ps)
mkAbs a = MModule q (MTAbstract absName) (MBody ne (OpenIn []) (topDefs a)) mkAbs a = MModule q (MTAbstract absName) (MBody ne (OpenIn []) (topDefs a))
mkRes ps r = MModule q (MTResource resName) (MBody ne (OpenIn ops) (topDefs r)) mkCnc ps r = MModule q (MTConcrete cncName absName) (MBody ne (OpenIn []) (topDefs r))
where ops = map OName ps
mkCnc ps r = MModule q (MTConcrete cncName absName)
(MBody ne (OpenIn (map OName (resName:ps))) (topDefs r))
mkPack (m, ds) = MModule q (MTResource m) (MBody ne (OpenIn []) (topDefs ds))
topDefs t = t topDefs t = t
ne = NoExt ne = NoExt
q = CMCompl q = CMCompl
@@ -742,21 +738,7 @@ transOldGrammar opts name0 x = case x of
_:s -> (beg, takeWhile (/='.') s) _:s -> (beg, takeWhile (/='.') s)
transInclude :: Include -> Err [FilePath] transInclude :: Include -> Err [FilePath]
transInclude x = case x of transInclude x = Bad "Old GF with includes no more supported in GF 3.0"
NoIncl -> return []
Incl filenames -> return $ map trans filenames
where
trans f = case f of
FString s -> s
FIdent (PIdent (_, s)) -> modif s
FSlash filename -> '/' : trans filename
FDot filename -> '.' : trans filename
FMinus filename -> '-' : trans filename
FAddId (PIdent (_, s)) filename -> modif s ++ trans filename
modif s = let s' = BS.snoc (BS.init s) (toLower (BS.last s)) in
BS.unpack (if elem (BS.unpack s') newReservedWords then s' else s)
--- unsafe hack ; cf. GetGrammar.oldLexer
newReservedWords :: [String] newReservedWords :: [String]
newReservedWords = newReservedWords =

View File

@@ -34,6 +34,9 @@ lookType :: PGF -> CId -> Type
lookType pgf f = lookType pgf f =
fst $ lookMap (error $ "lookType " ++ show f) f (funs (abstract pgf)) fst $ lookMap (error $ "lookType " ++ show f) f (funs (abstract pgf))
lookValCat :: PGF -> CId -> CId
lookValCat pgf = valCat . lookType pgf
lookParser :: PGF -> CId -> Maybe ParserInfo lookParser :: PGF -> CId -> Maybe ParserInfo
lookParser pgf lang = Map.lookup lang (concretes pgf) >>= parser lookParser pgf lang = Map.lookup lang (concretes pgf) >>= parser

View File

@@ -20,12 +20,13 @@ module PGF.VisualizeTree ( visualizeTrees
import PGF.CId (prCId) import PGF.CId (prCId)
import PGF.Data import PGF.Data
import PGF.Macros (lookValCat)
visualizeTrees :: Bool -> [Tree] -> String visualizeTrees :: PGF -> (Bool,Bool) -> [Tree] -> String
visualizeTrees digr = unlines . map (prGraph digr . tree2graph digr) visualizeTrees pgf funscats = unlines . map (prGraph False . tree2graph pgf funscats)
tree2graph :: Bool -> Tree -> [String] tree2graph :: PGF -> (Bool,Bool) -> Tree -> [String]
tree2graph digr = prf [] where tree2graph pgf (funs,cats) = prf [] where
prf ps t = case t of prf ps t = case t of
Fun cid trees -> Fun cid trees ->
let (nod,lab) = prn ps cid in let (nod,lab) = prn ps cid in
@@ -33,10 +34,15 @@ tree2graph digr = prf [] where
[ pra (j:ps) nod t | (j,t) <- zip [0..] trees] ++ [ pra (j:ps) nod t | (j,t) <- zip [0..] trees] ++
concat [prf (j:ps) t | (j,t) <- zip [0..] trees] concat [prf (j:ps) t | (j,t) <- zip [0..] trees]
prn ps cid = prn ps cid =
let lab = "\"" ++ prCId cid ++ "\"" let
fun = if funs then prCId cid else ""
cat = if cats then prCat cid else ""
colon = if funs && cats then " : " else ""
lab = "\"" ++ fun ++ colon ++ cat ++ "\""
in (show(show (ps :: [Int])),lab) in (show(show (ps :: [Int])),lab)
pra i nod t@(Fun cid _) = nod ++ arr ++ fst (prn i cid) ++ " [style = \"solid\"];" pra i nod t@(Fun cid _) = nod ++ arr ++ fst (prn i cid) ++ " [style = \"solid\"];"
arr = if digr then " -> " else " -- " arr = " -- " -- if digr then " -> " else " -- "
prCat = prCId . lookValCat pgf
prGraph digr ns = concat $ map (++"\n") $ [graph ++ "{\n"] ++ ns ++ ["}"] where prGraph digr ns = concat $ map (++"\n") $ [graph ++ "{\n"] ++ ns ++ ["}"] where
graph = if digr then "digraph" else "graph" graph = if digr then "digraph" else "graph"