combined parsing & pretty-printing

Dear Café, I working on a DSL represented by a algebraic data type with many constructors. I can write (separately) a parser and a pretty-printer for it, and I am doing so at the moment. However, this way it feels like repeating the same information twice. Is there any work to combine the two? Best, Ozgur

On Wed, Jan 26, 2011 at 04:22:00PM +0000, Ozgur Akgun wrote:
Dear Café,
I working on a DSL represented by a algebraic data type with many constructors. I can write (separately) a parser and a pretty-printer for it, and I am doing so at the moment. However, this way it feels like repeating the same information twice.
Is there any work to combine the two?
Maybe take a look at "Invertible Syntax Descriptions: Unifying Parsing and Pretty Printing" by Tillmann Rendel and Klaus Ostermann from last year's Haskell Symposium: http://www.informatik.uni-marburg.de/~rendel/unparse/ It's a beautiful paper, and perhaps the code will work for you (although it's too bad it's not on Hackage). -Brent

Hi Ozgur, Ozgur Akgun wrote:
I can write (separately) a parser and a pretty-printer [...] Is there any work to combine the two?
Brent Yorgey wrote:
Maybe take a look at "Invertible Syntax Descriptions: Unifying Parsing and Pretty Printing" by Tillmann Rendel and Klaus Ostermann from last year's Haskell Symposium:
http://www.informatik.uni-marburg.de/~rendel/unparse/
It's a beautiful paper, and perhaps the code will work for you (although it's too bad it's not on Hackage).
Indeed, I started this project for exactly the reason Ozgur describes: I needed to duplicate a lot of information between parsers and pretty printers and was annoyed about it. With invertible syntax descriptions, I now write a single program, which looks like a combinator parser (think "Parsec"), but can work as a pretty printer, too. I just uploaded the code from the paper (and some additional combinators) to Hackage: http://hackage.haskell.org/package/partial-isomorphisms http://hackage.haskell.org/package/invertible-syntax I use this code for the implementation of some very small languages (think "lambda calculus"). This works fine. I haven't really tried it for larger languages, but we have two students here in Marburg implementing a parser for Java using the library, so we are going to have experience with larger languages in a few weeks (months?). If you give it a try, I would be happy to receive success stories, bug reports, patches, feature requests etc. I want to keep working on this, and I am open for suggestions. Tillmann

Thanks for all the suggestions, and the great work by Tillmann. I'll have a
look into the paper and the code, and try to see if it suits my needs.
Thanks!
2011/1/26 Tillmann Rendel
Hi Ozgur,
Ozgur Akgun wrote:
I can write (separately) a parser and a pretty-printer [...]
Is there any work to combine the two?
Brent Yorgey wrote:
Maybe take a look at "Invertible Syntax Descriptions: Unifying Parsing and Pretty Printing" by Tillmann Rendel and Klaus Ostermann from last year's Haskell Symposium:
http://www.informatik.uni-marburg.de/~rendel/unparse/
It's a beautiful paper, and perhaps the code will work for you (although it's too bad it's not on Hackage).
Indeed, I started this project for exactly the reason Ozgur describes: I needed to duplicate a lot of information between parsers and pretty printers and was annoyed about it. With invertible syntax descriptions, I now write a single program, which looks like a combinator parser (think "Parsec"), but can work as a pretty printer, too.
I just uploaded the code from the paper (and some additional combinators) to Hackage:
http://hackage.haskell.org/package/partial-isomorphisms http://hackage.haskell.org/package/invertible-syntax
I use this code for the implementation of some very small languages (think "lambda calculus"). This works fine.
I haven't really tried it for larger languages, but we have two students here in Marburg implementing a parser for Java using the library, so we are going to have experience with larger languages in a few weeks (months?).
If you give it a try, I would be happy to receive success stories, bug reports, patches, feature requests etc. I want to keep working on this, and I am open for suggestions.
Tillmann
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Ozgur Akgun

Tillmann,
I've been looking into you packages, very neat ideas and a nice
implementation really.
I've already implemented a toy example and it worked great. Now I am trying
to use your library in a more serious piece of code, and I've realised that
defineIsomorphisms doesn't support record constructors. To be precise, you
handle the case for NormalC in the code, however you do not handle RecC. I
don't think this will be a difficult thing to add. Is there any reason for
you not to support RecC?
Best,
2011/1/26 Tillmann Rendel
Hi Ozgur,
Ozgur Akgun wrote:
I can write (separately) a parser and a pretty-printer [...]
Is there any work to combine the two?
Brent Yorgey wrote:
Maybe take a look at "Invertible Syntax Descriptions: Unifying Parsing and Pretty Printing" by Tillmann Rendel and Klaus Ostermann from last year's Haskell Symposium:
http://www.informatik.uni-marburg.de/~rendel/unparse/
It's a beautiful paper, and perhaps the code will work for you (although it's too bad it's not on Hackage).
Indeed, I started this project for exactly the reason Ozgur describes: I needed to duplicate a lot of information between parsers and pretty printers and was annoyed about it. With invertible syntax descriptions, I now write a single program, which looks like a combinator parser (think "Parsec"), but can work as a pretty printer, too.
I just uploaded the code from the paper (and some additional combinators) to Hackage:
http://hackage.haskell.org/package/partial-isomorphisms http://hackage.haskell.org/package/invertible-syntax
I use this code for the implementation of some very small languages (think "lambda calculus"). This works fine.
I haven't really tried it for larger languages, but we have two students here in Marburg implementing a parser for Java using the library, so we are going to have experience with larger languages in a few weeks (months?).
If you give it a try, I would be happy to receive success stories, bug reports, patches, feature requests etc. I want to keep working on this, and I am open for suggestions.
Tillmann
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Ozgur Akgun

Tillmann Rendel and Klaus Ostermann. "Invertible syntax descriptions: Unifying parsing and pretty printing".
Haskell Symposium 2010.
Regards,
Malcolm
On 26 Jan, 2011,at 04:22 PM, Ozgur Akgun

On 01/26/2011 05:22 PM, Ozgur Akgun wrote:
I working on a DSL represented by a algebraic data type with many constructors. I can write (separately) a parser and a pretty-printer for it, and I am doing so at the moment. However, this way it feels like repeating the same information twice.
Is there any work to combine the two?
You might want to take a look at [1, 2]XML Picklers from [3]HXT. Steffen [1] http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XM... [2] http://blog.typlab.com/2009/11/writing-a-generic-xml-pickler/ [3] http://hackage.haskell.org/package/hxt-9.0.1
Best, Ozgur
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Depending on your concrete syntax, you may be able to use BNFC
(http://hackage.haskell.org/package/BNFC).
/J
On 26 January 2011 17:22, Ozgur Akgun
Dear Café, I working on a DSL represented by a algebraic data type with many constructors. I can write (separately) a parser and a pretty-printer for it, and I am doing so at the moment. However, this way it feels like repeating the same information twice.
Is there any work to combine the two? Best, Ozgur _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Ozgur Akgun
I working on a DSL represented by a algebraic data type with many constructors. I can write (separately) a parser and a pretty-printer for it, and I am doing so at the moment. However, this way it feels like repeating the same information twice.
Is there any work to combine the two?
Tillmann Rendel and Klaus Ostermann's Haskell Symposium 2010 paper is one work to combine the two. You can also use Ranta's Grammatical Framework (JFP 2004), which has a production implementation and additional linguistic theory behind it. -- Edit this signature at http://www.digitas.harvard.edu/cgi-bin/ken/sig Insert wit here.
participants (7)
-
Brent Yorgey
-
Chung-chieh Shan
-
Jonas Almström Duregård
-
malcolm.wallace
-
Ozgur Akgun
-
Steffen Schuldenzucker
-
Tillmann Rendel