Macquarie University Sydney, Australia http://www.comp.mq.edu.au/~asloane https://wiki.mq.edu.au/display/plrg Functional Pretty Printer Combinators in Scala
Chitil Journal of Functional Programming, 19 (1), 1-16, Jan. 2009 Also useful: Unparsing Expressions With Prefix and Postfix Operators Norman Ramsey Software—Practice and Experience, 28 (12), 1327-1356, Oct.1998
class Num (d : Double) extends Exp case class Var (s : Idn) extends Exp case class Neg (e : Exp) extends Exp case class Add (l : Exp, r : Exp) extends Exp case class Sub (l : Exp, r : Exp) extends Exp case class Mul (l : Exp, r : Exp) extends Exp trait Stmt extends ImperativeNode case class Null () extends Stmt case class Seqn (ss : Seq[Stmt]) extends Stmt case class Asgn (v : Var, e : Exp) extends Stmt case class While (e : Exp, b : Stmt) extends Stmt
Doc = t match { case Num (d) => value (d) case Var (s) => s case Neg (e) => parens ("-" <> show (e)) case Add (l, r) => showbin (l, "+", r) case Sub (l, r) => showbin (l, "-", r) case Mul (l, r) => showbin (l, "*", r) case Div (l, r) => showbin (l, "/", r) case Null () => semi case Seqn (ss) => group (braces (nest (line <> ssep (ss map show, line)) <> line)) case Asgn (v, e) => show (v) <+> "=" <+> show (e) <> semi case While (e, b) => "while" <+> parens (show (e)) <> group (nest (line <> show (b))) } def showbin (l : ImperativeNode, op : String, r : ImperativeNode) : Doc = parens (show (l) <+> op <+> show (r))