0N/ADescription : pretty printing ADL syntax
0N/ACopyright : (c) Stef Joosten, Christian Maeder DFKI GmbH 2010
0N/AMaintainer : Christian.Maeder@dfki.de
0N/AStability : provisional
0N/APortability : portable
0N/Ainstance Pretty Concept where
0N/A pretty c = case c of
0N/Ainstance Pretty RelType where
0N/A pretty (RelType c1 c2) = case (c1, c2) of
0N/A (Anything, Anything) -> empty
0N/A _ | c1 == c2 -> brackets $ pretty c1
0N/A _ -> brackets $ hcat [pretty c1, cross, pretty c2]
0N/Ainstance Pretty Relation where
0N/A pretty (Sgn n t) = let s = tokStr n in
0N/A (if isBRel s then keyword s else pretty n)
0N/A _ -> stringToId $ show o
0N/Ainstance Pretty UnOp where
0N/A pretty = idDoc . stringToId . show
0N/AinOp = stringToId . show
0N/Ainstance Pretty MulOp where
0N/A pretty o = let i = idDoc (inOp o) in case o of
0N/A _ -> space <> i <> space
0N/AprettyParen :: (Rule -> Bool) -> Rule -> Doc
0N/AprettyParen p e = (if p e then parens else id) $ pretty e
minusId = mkId [mkSimpleId $ show Cp, placeTok]
converseId = mkId [placeTok, mkSimpleId $ show Co]
[ (minusId, [mkSimpleId "\\overline{", placeTok, mkSimpleId "}"])
, (converseId, [mkSimpleId "\\widetilde{", placeTok, mkSimpleId "}"])
, (inOp Fi, [mkSimpleId "\\cap"])
, (inOp Fu, [mkSimpleId "\\cup"])
, (inOp Fd, [mkSimpleId "\\dag"])
, (inOp Ri, [mkSimpleId "\\vdash"])
, (inOp Rr, [mkSimpleId "\\dashv"])
, (inOp Re, [mkSimpleId "\\equiv"])
, (stringToId $ show Co, [mkSimpleId "\\breve{~}"])
, (pOp K0, [mkSimpleId "\\texttt{*}"])
, (pOp K1, [mkSimpleId "\\texttt{+}"])
{ display_annos = displayMap }
instance Pretty Rule where
pretty e = useGlobalAnnos adlGA $ case e of
fcat . punctuate (pretty o) $ map
(prettyParen (\ a -> case a of
MulExp p _ -> p >= o || o == Rr && p == Ri
then idApplDoc (pOp o) . (: [])
$ prettyParen (\ a -> case a of
UnExp p _ -> o /= Cp && p == Cp
instance Pretty Prop where
instance Pretty RangedProp where
pretty = pretty . propProp
instance Pretty Object where
pretty (Object n e as os) = sep
[ fsep [commentText (tokStr n) <> colon, pretty e]
, if null as then empty else fsep $ keyword "ALWAYS" : map pretty as
, if null os then empty else equals <+> brackets (ppWithCommas os) ]
instance Pretty RuleKind where
pretty = keyword . showRuleKind
instance Pretty RuleHeader where
RuleHeader k t -> keyword
(if k == SignalOn then "SIGNAL" else "RULE")
<+> pretty t <+> pretty k
instance Pretty KeyAtt where
pretty (KeyAtt mt e) = sep [case mt of
Just t -> pretty t <> colon
instance Pretty KeyDef where
pretty (KeyDef l c atts) = fsep
, parens $ ppWithCommas atts ]
instance Pretty Pair where
pretty (Pair x y) = parens $ ppWithCommas [x, y]
prettyContent :: [Pair] -> Doc
prettyContent = brackets . vcat . punctuate semi . map pretty
instance Pretty PatElem where
Pr k r -> pretty k <+> pretty r
Pg c1 c2 -> fsep [keyword "GEN", pretty c1, keyword "ISA", pretty c2]
Pm ps (Sgn n (RelType c1 c2)) b ->
f = elem u ps && elem t ps
ns = if f then delete t $ delete u ps else ps
[ pretty n, text "::", pretty c1
, if f then funArrow else cross, pretty c2
, if null ns then empty else brackets $ ppWithCommas ns]
<> if b then empty else dot
Plug p o -> sep [keyword $ showUp p, pretty o]
Population b r l -> let d = prettyContent l in
if b then equals <+> d <> dot else fsep
instance Pretty Context where
pretty (Context m ps) = let l = vcat $ map pretty ps in case m of
[keyword "CONTEXT" <+> structId (tokStr t), l, keyword "ENDCONTEXT"]