Open joelburget opened 4 years ago
The three classic pretty-printer papers:
There's an adaptation of Wadler's algorithm to OCaml -- Strictly Pretty -- Christian Linding, 2000.
Wadler's algorithm is presented as a set of combinators
(<>) :: Doc -> Doc -> Doc nil :: Doc text :: String -> Doc line :: Doc nest :: Int -> Doc -> Doc group :: Doc -> Doc (<|>) :: Doc -> Doc -> Doc flatten :: Doc -> Doc
However, we want to specify layout as part of the concrete syntax declaration. Probably with boxes. Eg:
com := | "skip" { skip() } | [<hv 1,3,0> [<h 1> name ":="] iexp] { assign($1; $2) } | [<hov 1, 0, 0> [<h 1> "if" bexp] [<h 1> "then" com] [<h 1> "else" com] ] { if($2; $4; $6) } ...
This example is taken with only minor modifications from Syn: a single language for specifying abstract syntax trees, lexical analysis, parsing and pretty-printing -- Richard J Boulton, 1996.
This is also quite similar to Ocaml's Format (they even have almost exactly the same types of boxes):
The Syn declaration seems a little heavy-weight. Ocaml also has break hints. This seems like roughly the right direction -- I'm still weighing the tradeoffs.
Other:
The three classic pretty-printer papers:
There's an adaptation of Wadler's algorithm to OCaml -- Strictly Pretty -- Christian Linding, 2000.
Wadler's algorithm is presented as a set of combinators
However, we want to specify layout as part of the concrete syntax declaration. Probably with boxes. Eg:
This example is taken with only minor modifications from Syn: a single language for specifying abstract syntax trees, lexical analysis, parsing and pretty-printing -- Richard J Boulton, 1996.
This is also quite similar to Ocaml's Format (they even have almost exactly the same types of boxes):
The Syn declaration seems a little heavy-weight. Ocaml also has break hints. This seems like roughly the right direction -- I'm still weighing the tradeoffs.
Other: