{-# OPTIONS -fno-warn-incomplete-patterns #-}
module Language.Clafer.Front.Printclafer where

-- pretty-printer generated by the BNF converter

import Language.Clafer.Front.Absclafer
import Prelude hiding (span, exp, init)
import Data.Char


-- the top-level printing method
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 (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts
    "}"      :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) 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)

-- the printer class does the job
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])