module Language.Clafer.Front.Printclafer where
import Language.Clafer.Front.Absclafer
import Prelude hiding (span, exp, init)
import Data.Char
printTree :: Print a => a -> String
printTree = render . prt 0
type Doc = [ShowS] -> [ShowS]
doc :: ShowS -> Doc
doc = (:)
render :: Doc -> String
render d = rend 0 (map ($ "") $ d []) "" where
rend i ss = case ss of
"[" :ts -> showChar '[' . rend i ts
"(" :ts -> showChar '(' . rend i ts
"{" :ts -> showChar '{' . new (i+1) . rend (i+1) ts
"}" : ";":ts -> new (i1) . space "}" . showChar ';' . new (i1) . rend (i1) ts
"}" :ts -> new (i1) . showChar '}' . new (i1) . rend (i1) ts
";" :ts -> showChar ';' . new i . rend i ts
t : "," :ts -> showString t . space "," . rend i ts
t : ")" :ts -> showString t . showChar ')' . rend i ts
t : "]" :ts -> showString t . showChar ']' . rend i ts
t :ts -> space t . rend i ts
_ -> id
new i = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace
space t = showString t . (\s -> if null s then "" else (' ':s))
parenth :: Doc -> Doc
parenth ss = doc (showChar '(') . ss . doc (showChar ')')
concatS :: [ShowS] -> ShowS
concatS = foldr (.) id
concatD :: [Doc] -> Doc
concatD = foldr (.) id
replicateS :: Int -> ShowS -> ShowS
replicateS n f = concatS (replicate n f)
class Print a where
prt :: Int -> a -> Doc
prtList :: [a] -> Doc
prtList = concatD . map (prt 0)
instance Print a => Print [a] where
prt _ = prtList
instance Print Char where
prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'')
prtList s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')
mkEsc :: Char -> Char -> ShowS
mkEsc q s = case s of
_ | s == q -> showChar '\\' . showChar s
'\\'-> showString "\\\\"
'\n' -> showString "\\n"
'\t' -> showString "\\t"
_ -> showChar s
prPrec :: Int -> Int -> Doc -> Doc
prPrec i j = if j<i then parenth else id
instance Print Integer where
prt _ x = doc (shows x)
instance Print Double where
prt _ x = doc (shows x)
instance Print PosInteger where
prt _ (PosInteger (_,i)) = doc (showString ( i))
instance Print PosDouble where
prt _ (PosDouble (_,i)) = doc (showString ( i))
instance Print PosString where
prt _ (PosString (_,i)) = doc (showString ( i))
instance Print PosIdent where
prt _ (PosIdent (_,i)) = doc (showString ( i))
instance Print Module where
prt i e = case e of
Module declarations -> prPrec i 0 (concatD [prt 0 declarations])
PosModule span declarations -> prPrec i 0 (concatD [prt 0 span , prt 0 declarations])
instance Print Declaration where
prt i e = case e of
EnumDecl posident enumids -> prPrec i 0 (concatD [doc (showString "enum") , prt 0 posident , doc (showString "=") , prt 0 enumids])
PosEnumDecl span posident enumids -> prPrec i 0 (concatD [prt 0 span , doc (showString "enum") , prt 0 posident , doc (showString "=") , prt 0 enumids])
ElementDecl element -> prPrec i 0 (concatD [prt 0 element])
PosElementDecl span element -> prPrec i 0 (concatD [prt 0 span , prt 0 element])
prtList es = case es of
[] -> (concatD [])
x:xs -> (concatD [prt 0 x , prt 0 xs])
instance Print Clafer where
prt i e = case e of
Clafer abstract gcard posident super card init elements -> prPrec i 0 (concatD [prt 0 abstract , prt 0 gcard , prt 0 posident , prt 0 super , prt 0 card , prt 0 init , prt 0 elements])
PosClafer span abstract gcard posident super card init elements -> prPrec i 0 (concatD [prt 0 span , prt 0 abstract , prt 0 gcard , prt 0 posident , prt 0 super , prt 0 card , prt 0 init , prt 0 elements])
instance Print Constraint where
prt i e = case e of
Constraint exps -> prPrec i 0 (concatD [doc (showString "[") , prt 0 exps , doc (showString "]")])
PosConstraint span exps -> prPrec i 0 (concatD [prt 0 span , doc (showString "[") , prt 0 exps , doc (showString "]")])
instance Print SoftConstraint where
prt i e = case e of
SoftConstraint exps -> prPrec i 0 (concatD [doc (showString "(") , prt 0 exps , doc (showString ")")])
PosSoftConstraint span exps -> prPrec i 0 (concatD [prt 0 span , doc (showString "(") , prt 0 exps , doc (showString ")")])
instance Print Goal where
prt i e = case e of
Goal exps -> prPrec i 0 (concatD [doc (showString "<<") , prt 0 exps , doc (showString ">>")])
PosGoal span exps -> prPrec i 0 (concatD [prt 0 span , doc (showString "<<") , prt 0 exps , doc (showString ">>")])
instance Print Abstract where
prt i e = case e of
AbstractEmpty -> prPrec i 0 (concatD [])
PosAbstractEmpty span -> prPrec i 0 (concatD [prt 0 span])
Abstract -> prPrec i 0 (concatD [doc (showString "abstract")])
PosAbstract span -> prPrec i 0 (concatD [prt 0 span , doc (showString "abstract")])
instance Print Elements where
prt i e = case e of
ElementsEmpty -> prPrec i 0 (concatD [])
PosElementsEmpty span -> prPrec i 0 (concatD [prt 0 span])
ElementsList elements -> prPrec i 0 (concatD [doc (showString "{") , prt 0 elements , doc (showString "}")])
PosElementsList span elements -> prPrec i 0 (concatD [prt 0 span , doc (showString "{") , prt 0 elements , doc (showString "}")])
instance Print Element where
prt i e = case e of
Subclafer clafer -> prPrec i 0 (concatD [prt 0 clafer])
PosSubclafer span clafer -> prPrec i 0 (concatD [prt 0 span , prt 0 clafer])
ClaferUse name card elements -> prPrec i 0 (concatD [doc (showString "`") , prt 0 name , prt 0 card , prt 0 elements])
PosClaferUse span name card elements -> prPrec i 0 (concatD [prt 0 span , doc (showString "`") , prt 0 name , prt 0 card , prt 0 elements])
Subconstraint constraint -> prPrec i 0 (concatD [prt 0 constraint])
PosSubconstraint span constraint -> prPrec i 0 (concatD [prt 0 span , prt 0 constraint])
Subgoal goal -> prPrec i 0 (concatD [prt 0 goal])
PosSubgoal span goal -> prPrec i 0 (concatD [prt 0 span , prt 0 goal])
Subsoftconstraint softconstraint -> prPrec i 0 (concatD [prt 0 softconstraint])
PosSubsoftconstraint span softconstraint -> prPrec i 0 (concatD [prt 0 span , prt 0 softconstraint])
prtList es = case es of
[] -> (concatD [])
x:xs -> (concatD [prt 0 x , prt 0 xs])
instance Print Super where
prt i e = case e of
SuperEmpty -> prPrec i 0 (concatD [])
PosSuperEmpty span -> prPrec i 0 (concatD [prt 0 span])
SuperSome superhow setexp -> prPrec i 0 (concatD [prt 0 superhow , prt 0 setexp])
PosSuperSome span superhow setexp -> prPrec i 0 (concatD [prt 0 span , prt 0 superhow , prt 0 setexp])
instance Print SuperHow where
prt i e = case e of
SuperColon -> prPrec i 0 (concatD [doc (showString ":")])
PosSuperColon span -> prPrec i 0 (concatD [prt 0 span , doc (showString ":")])
SuperArrow -> prPrec i 0 (concatD [doc (showString "->")])
PosSuperArrow span -> prPrec i 0 (concatD [prt 0 span , doc (showString "->")])
SuperMArrow -> prPrec i 0 (concatD [doc (showString "->>")])
PosSuperMArrow span -> prPrec i 0 (concatD [prt 0 span , doc (showString "->>")])
instance Print Init where
prt i e = case e of
InitEmpty -> prPrec i 0 (concatD [])
PosInitEmpty span -> prPrec i 0 (concatD [prt 0 span])
InitSome inithow exp -> prPrec i 0 (concatD [prt 0 inithow , prt 0 exp])
PosInitSome span inithow exp -> prPrec i 0 (concatD [prt 0 span , prt 0 inithow , prt 0 exp])
instance Print InitHow where
prt i e = case e of
InitHow_1 -> prPrec i 0 (concatD [doc (showString "=")])
PosInitHow_1 span -> prPrec i 0 (concatD [prt 0 span , doc (showString "=")])
InitHow_2 -> prPrec i 0 (concatD [doc (showString ":=")])
PosInitHow_2 span -> prPrec i 0 (concatD [prt 0 span , doc (showString ":=")])
instance Print GCard where
prt i e = case e of
GCardEmpty -> prPrec i 0 (concatD [])
PosGCardEmpty span -> prPrec i 0 (concatD [prt 0 span])
GCardXor -> prPrec i 0 (concatD [doc (showString "xor")])
PosGCardXor span -> prPrec i 0 (concatD [prt 0 span , doc (showString "xor")])
GCardOr -> prPrec i 0 (concatD [doc (showString "or")])
PosGCardOr span -> prPrec i 0 (concatD [prt 0 span , doc (showString "or")])
GCardMux -> prPrec i 0 (concatD [doc (showString "mux")])
PosGCardMux span -> prPrec i 0 (concatD [prt 0 span , doc (showString "mux")])
GCardOpt -> prPrec i 0 (concatD [doc (showString "opt")])
PosGCardOpt span -> prPrec i 0 (concatD [prt 0 span , doc (showString "opt")])
GCardInterval ncard -> prPrec i 0 (concatD [prt 0 ncard])
PosGCardInterval span ncard -> prPrec i 0 (concatD [prt 0 span , prt 0 ncard])
instance Print Card where
prt i e = case e of
CardEmpty -> prPrec i 0 (concatD [])
PosCardEmpty span -> prPrec i 0 (concatD [prt 0 span])
CardLone -> prPrec i 0 (concatD [doc (showString "?")])
PosCardLone span -> prPrec i 0 (concatD [prt 0 span , doc (showString "?")])
CardSome -> prPrec i 0 (concatD [doc (showString "+")])
PosCardSome span -> prPrec i 0 (concatD [prt 0 span , doc (showString "+")])
CardAny -> prPrec i 0 (concatD [doc (showString "*")])
PosCardAny span -> prPrec i 0 (concatD [prt 0 span , doc (showString "*")])
CardNum posinteger -> prPrec i 0 (concatD [prt 0 posinteger])
PosCardNum span posinteger -> prPrec i 0 (concatD [prt 0 span , prt 0 posinteger])
CardInterval ncard -> prPrec i 0 (concatD [prt 0 ncard])
PosCardInterval span ncard -> prPrec i 0 (concatD [prt 0 span , prt 0 ncard])
instance Print NCard where
prt i e = case e of
NCard posinteger exinteger -> prPrec i 0 (concatD [prt 0 posinteger , doc (showString "..") , prt 0 exinteger])
PosNCard span posinteger exinteger -> prPrec i 0 (concatD [prt 0 span , prt 0 posinteger , doc (showString "..") , prt 0 exinteger])
instance Print ExInteger where
prt i e = case e of
ExIntegerAst -> prPrec i 0 (concatD [doc (showString "*")])
PosExIntegerAst span -> prPrec i 0 (concatD [prt 0 span , doc (showString "*")])
ExIntegerNum posinteger -> prPrec i 0 (concatD [prt 0 posinteger])
PosExIntegerNum span posinteger -> prPrec i 0 (concatD [prt 0 span , prt 0 posinteger])
instance Print Name where
prt i e = case e of
Path modids -> prPrec i 0 (concatD [prt 0 modids])
PosPath span modids -> prPrec i 0 (concatD [prt 0 span , prt 0 modids])
instance Print Exp where
prt i e = case e of
DeclAllDisj decl exp -> prPrec i 0 (concatD [doc (showString "all") , doc (showString "disj") , prt 0 decl , doc (showString "|") , prt 0 exp])
PosDeclAllDisj span decl exp -> prPrec i 0 (concatD [prt 0 span , doc (showString "all") , doc (showString "disj") , prt 0 decl , doc (showString "|") , prt 0 exp])
DeclAll decl exp -> prPrec i 0 (concatD [doc (showString "all") , prt 0 decl , doc (showString "|") , prt 0 exp])
PosDeclAll span decl exp -> prPrec i 0 (concatD [prt 0 span , doc (showString "all") , prt 0 decl , doc (showString "|") , prt 0 exp])
DeclQuantDisj quant decl exp -> prPrec i 0 (concatD [prt 0 quant , doc (showString "disj") , prt 0 decl , doc (showString "|") , prt 0 exp])
PosDeclQuantDisj span quant decl exp -> prPrec i 0 (concatD [prt 0 span , prt 0 quant , doc (showString "disj") , prt 0 decl , doc (showString "|") , prt 0 exp])
DeclQuant quant decl exp -> prPrec i 0 (concatD [prt 0 quant , prt 0 decl , doc (showString "|") , prt 0 exp])
PosDeclQuant span quant decl exp -> prPrec i 0 (concatD [prt 0 span , prt 0 quant , prt 0 decl , doc (showString "|") , prt 0 exp])
EGMax exp -> prPrec i 1 (concatD [doc (showString "max") , prt 2 exp])
PosEGMax span exp -> prPrec i 1 (concatD [prt 0 span , doc (showString "max") , prt 2 exp])
EGMin exp -> prPrec i 1 (concatD [doc (showString "min") , prt 2 exp])
PosEGMin span exp -> prPrec i 1 (concatD [prt 0 span , doc (showString "min") , prt 2 exp])
EIff exp0 exp -> prPrec i 1 (concatD [prt 1 exp0 , doc (showString "<=>") , prt 2 exp])
PosEIff span exp0 exp -> prPrec i 1 (concatD [prt 0 span , prt 1 exp0 , doc (showString "<=>") , prt 2 exp])
EImplies exp0 exp -> prPrec i 2 (concatD [prt 2 exp0 , doc (showString "=>") , prt 3 exp])
PosEImplies span exp0 exp -> prPrec i 2 (concatD [prt 0 span , prt 2 exp0 , doc (showString "=>") , prt 3 exp])
EOr exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "||") , prt 4 exp])
PosEOr span exp0 exp -> prPrec i 3 (concatD [prt 0 span , prt 3 exp0 , doc (showString "||") , prt 4 exp])
EXor exp0 exp -> prPrec i 4 (concatD [prt 4 exp0 , doc (showString "xor") , prt 5 exp])
PosEXor span exp0 exp -> prPrec i 4 (concatD [prt 0 span , prt 4 exp0 , doc (showString "xor") , prt 5 exp])
EAnd exp0 exp -> prPrec i 5 (concatD [prt 5 exp0 , doc (showString "&&") , prt 6 exp])
PosEAnd span exp0 exp -> prPrec i 5 (concatD [prt 0 span , prt 5 exp0 , doc (showString "&&") , prt 6 exp])
ENeg exp -> prPrec i 6 (concatD [doc (showString "!") , prt 7 exp])
PosENeg span exp -> prPrec i 6 (concatD [prt 0 span , doc (showString "!") , prt 7 exp])
ELt exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString "<") , prt 8 exp])
PosELt span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString "<") , prt 8 exp])
EGt exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString ">") , prt 8 exp])
PosEGt span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString ">") , prt 8 exp])
EEq exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString "=") , prt 8 exp])
PosEEq span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString "=") , prt 8 exp])
ELte exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString "<=") , prt 8 exp])
PosELte span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString "<=") , prt 8 exp])
EGte exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString ">=") , prt 8 exp])
PosEGte span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString ">=") , prt 8 exp])
ENeq exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString "!=") , prt 8 exp])
PosENeq span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString "!=") , prt 8 exp])
EIn exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString "in") , prt 8 exp])
PosEIn span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString "in") , prt 8 exp])
ENin exp0 exp -> prPrec i 7 (concatD [prt 7 exp0 , doc (showString "not") , doc (showString "in") , prt 8 exp])
PosENin span exp0 exp -> prPrec i 7 (concatD [prt 0 span , prt 7 exp0 , doc (showString "not") , doc (showString "in") , prt 8 exp])
QuantExp quant exp -> prPrec i 8 (concatD [prt 0 quant , prt 12 exp])
PosQuantExp span quant exp -> prPrec i 8 (concatD [prt 0 span , prt 0 quant , prt 12 exp])
EAdd exp0 exp -> prPrec i 9 (concatD [prt 9 exp0 , doc (showString "+") , prt 10 exp])
PosEAdd span exp0 exp -> prPrec i 9 (concatD [prt 0 span , prt 9 exp0 , doc (showString "+") , prt 10 exp])
ESub exp0 exp -> prPrec i 9 (concatD [prt 9 exp0 , doc (showString "-") , prt 10 exp])
PosESub span exp0 exp -> prPrec i 9 (concatD [prt 0 span , prt 9 exp0 , doc (showString "-") , prt 10 exp])
EMul exp0 exp -> prPrec i 10 (concatD [prt 10 exp0 , doc (showString "*") , prt 11 exp])
PosEMul span exp0 exp -> prPrec i 10 (concatD [prt 0 span , prt 10 exp0 , doc (showString "*") , prt 11 exp])
EDiv exp0 exp -> prPrec i 10 (concatD [prt 10 exp0 , doc (showString "/") , prt 11 exp])
PosEDiv span exp0 exp -> prPrec i 10 (concatD [prt 0 span , prt 10 exp0 , doc (showString "/") , prt 11 exp])
ESumSetExp exp -> prPrec i 11 (concatD [doc (showString "sum") , prt 12 exp])
PosESumSetExp span exp -> prPrec i 11 (concatD [prt 0 span , doc (showString "sum") , prt 12 exp])
ECSetExp exp -> prPrec i 11 (concatD [doc (showString "#") , prt 12 exp])
PosECSetExp span exp -> prPrec i 11 (concatD [prt 0 span , doc (showString "#") , prt 12 exp])
EMinExp exp -> prPrec i 11 (concatD [doc (showString "-") , prt 12 exp])
PosEMinExp span exp -> prPrec i 11 (concatD [prt 0 span , doc (showString "-") , prt 12 exp])
EImpliesElse exp0 exp1 exp -> prPrec i 12 (concatD [doc (showString "if") , prt 12 exp0 , doc (showString "then") , prt 12 exp1 , doc (showString "else") , prt 13 exp])
PosEImpliesElse span exp0 exp1 exp -> prPrec i 12 (concatD [prt 0 span , doc (showString "if") , prt 12 exp0 , doc (showString "then") , prt 12 exp1 , doc (showString "else") , prt 13 exp])
EInt posinteger -> prPrec i 13 (concatD [prt 0 posinteger])
PosEInt span posinteger -> prPrec i 13 (concatD [prt 0 span , prt 0 posinteger])
EDouble posdouble -> prPrec i 13 (concatD [prt 0 posdouble])
PosEDouble span posdouble -> prPrec i 13 (concatD [prt 0 span , prt 0 posdouble])
EStr posstring -> prPrec i 13 (concatD [prt 0 posstring])
PosEStr span posstring -> prPrec i 13 (concatD [prt 0 span , prt 0 posstring])
ESetExp setexp -> prPrec i 13 (concatD [prt 0 setexp])
PosESetExp span setexp -> prPrec i 13 (concatD [prt 0 span , prt 0 setexp])
prtList es = case es of
[] -> (concatD [])
x:xs -> (concatD [prt 0 x , prt 0 xs])
instance Print SetExp where
prt i e = case e of
Union setexp0 setexp -> prPrec i 0 (concatD [prt 0 setexp0 , doc (showString "++") , prt 1 setexp])
PosUnion span setexp0 setexp -> prPrec i 0 (concatD [prt 0 span , prt 0 setexp0 , doc (showString "++") , prt 1 setexp])
UnionCom setexp0 setexp -> prPrec i 0 (concatD [prt 0 setexp0 , doc (showString ",") , prt 1 setexp])
PosUnionCom span setexp0 setexp -> prPrec i 0 (concatD [prt 0 span , prt 0 setexp0 , doc (showString ",") , prt 1 setexp])
Difference setexp0 setexp -> prPrec i 1 (concatD [prt 1 setexp0 , doc (showString "--") , prt 2 setexp])
PosDifference span setexp0 setexp -> prPrec i 1 (concatD [prt 0 span , prt 1 setexp0 , doc (showString "--") , prt 2 setexp])
Intersection setexp0 setexp -> prPrec i 2 (concatD [prt 2 setexp0 , doc (showString "&") , prt 3 setexp])
PosIntersection span setexp0 setexp -> prPrec i 2 (concatD [prt 0 span , prt 2 setexp0 , doc (showString "&") , prt 3 setexp])
Domain setexp0 setexp -> prPrec i 3 (concatD [prt 3 setexp0 , doc (showString "<:") , prt 4 setexp])
PosDomain span setexp0 setexp -> prPrec i 3 (concatD [prt 0 span , prt 3 setexp0 , doc (showString "<:") , prt 4 setexp])
Range setexp0 setexp -> prPrec i 4 (concatD [prt 4 setexp0 , doc (showString ":>") , prt 5 setexp])
PosRange span setexp0 setexp -> prPrec i 4 (concatD [prt 0 span , prt 4 setexp0 , doc (showString ":>") , prt 5 setexp])
Join setexp0 setexp -> prPrec i 5 (concatD [prt 5 setexp0 , doc (showString ".") , prt 6 setexp])
PosJoin span setexp0 setexp -> prPrec i 5 (concatD [prt 0 span , prt 5 setexp0 , doc (showString ".") , prt 6 setexp])
ClaferId name -> prPrec i 6 (concatD [prt 0 name])
PosClaferId span name -> prPrec i 6 (concatD [prt 0 span , prt 0 name])
instance Print Decl where
prt i e = case e of
Decl locids setexp -> prPrec i 0 (concatD [prt 0 locids , doc (showString ":") , prt 0 setexp])
PosDecl span locids setexp -> prPrec i 0 (concatD [prt 0 span , prt 0 locids , doc (showString ":") , prt 0 setexp])
instance Print Quant where
prt i e = case e of
QuantNo -> prPrec i 0 (concatD [doc (showString "no")])
PosQuantNo span -> prPrec i 0 (concatD [prt 0 span , doc (showString "no")])
QuantLone -> prPrec i 0 (concatD [doc (showString "lone")])
PosQuantLone span -> prPrec i 0 (concatD [prt 0 span , doc (showString "lone")])
QuantOne -> prPrec i 0 (concatD [doc (showString "one")])
PosQuantOne span -> prPrec i 0 (concatD [prt 0 span , doc (showString "one")])
QuantSome -> prPrec i 0 (concatD [doc (showString "some")])
PosQuantSome span -> prPrec i 0 (concatD [prt 0 span , doc (showString "some")])
instance Print EnumId where
prt i e = case e of
EnumIdIdent posident -> prPrec i 0 (concatD [prt 0 posident])
PosEnumIdIdent span posident -> prPrec i 0 (concatD [prt 0 span , prt 0 posident])
prtList es = case es of
[x] -> (concatD [prt 0 x])
x:xs -> (concatD [prt 0 x , doc (showString "|") , prt 0 xs])
instance Print ModId where
prt i e = case e of
ModIdIdent posident -> prPrec i 0 (concatD [prt 0 posident])
PosModIdIdent span posident -> prPrec i 0 (concatD [prt 0 span , prt 0 posident])
prtList es = case es of
[x] -> (concatD [prt 0 x])
x:xs -> (concatD [prt 0 x , doc (showString "\\") , prt 0 xs])
instance Print LocId where
prt i e = case e of
LocIdIdent posident -> prPrec i 0 (concatD [prt 0 posident])
PosLocIdIdent span posident -> prPrec i 0 (concatD [prt 0 span , prt 0 posident])
prtList es = case es of
[x] -> (concatD [prt 0 x])
x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
instance Print Pos where
prt i e = case e of
Pos n0 n -> prPrec i 0 (concatD [prt 0 n0 , prt 0 n])
PosPos span n0 n -> prPrec i 0 (concatD [prt 0 span , prt 0 n0 , prt 0 n])
instance Print Span where
prt i e = case e of
Span pos0 pos -> prPrec i 0 (concatD [prt 0 pos0 , prt 0 pos])
PosSpan span pos0 pos -> prPrec i 0 (concatD [prt 0 span , prt 0 pos0 , prt 0 pos])