From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by yquem.inria.fr (Postfix) with ESMTP id BA567BBAF for ; Thu, 9 Dec 2010 12:13:23 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkABABNIAE2Ep8MOmWdsb2JhbACVS44kFQEBAQEBCAsKBxEpwA+FSgSKdIMa X-IronPort-AV: E=Sophos;i="4.59,319,1288566000"; d="dat'59?scan'59,208,59";a="83455717" Received: from cirse-out.extra.cea.fr ([132.167.195.14]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-SHA; 09 Dec 2010 12:13:23 +0100 Received: from pisaure.intra.cea.fr (pisaure.intra.cea.fr [132.166.88.21]) by cirse.extra.cea.fr (8.14.2/8.14.2/CEAnet-Internet-out-2.0) with ESMTP id oB9BDNM7001484 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Thu, 9 Dec 2010 12:13:23 +0100 Received: from muguet1.intra.cea.fr (muguet1.intra.cea.fr [132.166.192.6]) by pisaure.intra.cea.fr (8.14.4/8.14.4) with ESMTP id oB9BDMp7017857 for ; Thu, 9 Dec 2010 12:13:23 +0100 (envelope-from Pascal.CUOQ@cea.fr) Received: from levau.intra.cea.fr (levau.intra.cea.fr [132.166.88.52]) by muguet1.intra.cea.fr (8.13.8/8.13.8/CEAnet-Intranet-out-1.1) with ESMTP id oB9BDMIg031681 for ; Thu, 9 Dec 2010 12:13:22 +0100 Received: from LAXA.intra.cea.fr ([132.166.64.47]) by levau.intra.cea.fr with Microsoft SMTPSVC(6.0.3790.4675); Thu, 9 Dec 2010 12:13:22 +0100 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01CB9792.1775A413" Subject: Define parser and printer consistently Date: Thu, 9 Dec 2010 12:11:15 +0100 Message-ID: <5EFD4D7AC6265F4D9D3A849CEA92191902182AD9@LAXA.intra.cea.fr> X-MS-Has-Attach: X-MS-TNEF-Correlator: <5EFD4D7AC6265F4D9D3A849CEA92191902182AD9@LAXA.intra.cea.fr> Thread-Topic: Define parser and printer consistently Thread-Index: AcuXkEBM3/RY/rzBQPq4HRLHiwOaQQAAYuut References: <20101209110003.3C0B3BBAF@yquem.inria.fr> From: "CUOQ Pascal" To: X-OriginalArrivalTime: 09 Dec 2010 11:13:22.0464 (UTC) FILETIME=[17734200:01CB9792] X-Spam: no; 0.00; parser:01 cuoq:01 cuoq:01 parser:01 ocaml:01 minimized:01 ad-hoc:01 parsers:01 boomerang:98 boomerang:98 upenn:01 cea:01 grammar:02 data:02 define:02 X-Attachments: type="application/ms-tnef" name="winmail.dat" This is a multi-part message in MIME format. ------_=_NextPart_001_01CB9792.1775A413 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable >I'm going to define a parser and a printer for a simple grammar. >Is there a way to define both of them in a single construct using some=20 >existing OCaml tool? > >For example, I have a keyword "function". The usual parser would = contain=20 >a mapping like: >"function" -> `Function >and the straightforward printer would do: >`Function -> "function" > >What is the best way to combine these definitions, so that duplication=20 >would be minimized? Take a look at Boomerang: http://www.seas.upenn.edu/~harmony/ >>From the overview: Boomerang is a programming language for writing lenses=97well-behaved = bidirectional transformations=97that operate on ad-hoc, textual data = formats. Every lens program, when read from left to right, describes a = function that maps an input to an output; when read from right to left, = the very same program describes a "backwards" function that maps a = modified output, together with the original input, back to a modified = input. Lenses have been used to solve problems across a wide range of areas in = computing including: [...] in parsers and pretty printers ------_=_NextPart_001_01CB9792.1775A413 Content-Type: application/ms-tnef; name="winmail.dat" Content-Transfer-Encoding: base64 eJ8+IhcLAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEIgAcAGAAAAElQTS5NaWNy b3NvZnQgTWFpbC5Ob3RlADEIAQ2ABAACAAAAAgACAAEEgAEAJwAAAERlZmluZSBwYXJzZXIgYW5k IHByaW50ZXIgY29uc2lzdGVudGx5AL4OAQWAAwAOAAAA2gcMAAkADAALAA8ABAAgAQEggAMADgAA ANoHDAAJAAwADQAWAAQAKQEBCYABACEAAAA5RTFFNjMwN0U1NkE5RDREODRGMTU5NjU1MEE4Nzgw QQAkBwEDkAYAVAsAADkAAAADACYAAAAAAAMANgAAAAAAQAA5AFeR+cuRl8sBHgA9AAEAAAABAAAA AAAAAAIBRwABAAAALAAAAGM9RlI7YT1BVExBUztwPUNFQTtsPUxBWEEtMTAxMjA5MTExMzIyWi01 MjMAHgBJAAEAAAAjAAAAQ2FtbC1saXN0IERpZ2VzdCwgVm9sIDY2LCBJc3N1ZSAyMwAAQABOAIC7 7jqQl8sBHgBaAAEAAAAhAAAAY2FtbC1saXN0LWJvdW5jZXNAeXF1ZW0uaW5yaWEuZnIAAAAAAgFb AAEAAABfAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAAAAY2FtbC1saXN0LWJvdW5jZXNAeXF1ZW0u aW5yaWEuZnIAU01UUABjYW1sLWxpc3QtYm91bmNlc0B5cXVlbS5pbnJpYS5mcgAAAgFcAAEAAAAm AAAAU01UUDpDQU1MLUxJU1QtQk9VTkNFU0BZUVVFTS5JTlJJQS5GUgAAAB4AXQABAAAAIQAAAGNh bWwtbGlzdC1yZXF1ZXN0QHlxdWVtLmlucmlhLmZyAAAAAAIBXgABAAAAXwAAAAAAAACBKx+kvqMQ GZ1uAN0BD1QCAAAAAGNhbWwtbGlzdC1yZXF1ZXN0QHlxdWVtLmlucmlhLmZyAFNNVFAAY2FtbC1s aXN0LXJlcXVlc3RAeXF1ZW0uaW5yaWEuZnIAAAIBXwABAAAAJgAAAFNNVFA6Q0FNTC1MSVNULVJF UVVFU1RAWVFVRU0uSU5SSUEuRlIAAAAeAGYAAQAAAAUAAABTTVRQAAAAAB4AZwABAAAAIQAAAGNh bWwtbGlzdC1ib3VuY2VzQHlxdWVtLmlucmlhLmZyAAAAAB4AaAABAAAABQAAAFNNVFAAAAAAHgBp AAEAAAAhAAAAY2FtbC1saXN0LXJlcXVlc3RAeXF1ZW0uaW5yaWEuZnIAAAAAHgBwAAEAAAAnAAAA RGVmaW5lIHBhcnNlciBhbmQgcHJpbnRlciBjb25zaXN0ZW50bHkAAAIBcQABAAAAGwAAAAHLl5BA TN/0WP68wUD6uB0Sx4sDmkEAAGLrrQAeAHQAAQAAABkAAABjYW1sLWxpc3RAeXF1ZW0uaW5yaWEu ZnIAAAAAHgAaDAEAAAAMAAAAQ1VPUSBQYXNjYWwAHgAdDgEAAAAnAAAARGVmaW5lIHBhcnNlciBh bmQgcHJpbnRlciBjb25zaXN0ZW50bHkAAAIBCRABAAAAsQMAAK0DAAC0BQAATFpGdRjv7hEDAAoA cmNwZzEyNeIyA0N0ZXgFQQEDAfdPCoACpAPjAgBjaArAc/BldDAgBxMCgA/zAFB/BFYIVQeyEcUO UQMBEMcy9wYABsMRxTMERhDJEtsR09sI7wn3Oxi/DjA1EcIMYM5jAFALCQFkMzYRUAumAwrjCoA+ SSdtIGeCbwuAZyB0byABAeELgGUgYSAKsREgBcD9AHBkHzIFEAIwEyECEB+xOiAAkG0LUB8gCcBh bZkAwHIuHZYEIHRoBJBxHyJ3YXkemQbgIqAg/G9mIpIeIAuAIOMecCFRswWgAIB0chtwBUB1JSK/ IQADcB8gHZUOwAQAdB5ivE9DIaADIB6gBvA/HZU9HZVGBbEOwCGgIUEsIBRJIBDwdh8ia2V5hncF sB/wImZ1biYAwmkCICIuIFQisCYhznUHQB9WKwB1bB/wJZGfAZAk0R2VH0AAwHBwHmI0bGkq0Dod lStYIC3wPiBgRit1LgYf4SKh5yEAJdALcGdoADAFsCMg5yshIDYtJGRvL1YwtzByeytYKJxXEPAF QAQAMeNi/weQBUAjJQWgBtAfAiKhESD1HsRpK6JzKiAmkCKRNyH8ZHULUA3gNyA1Eh2VLSTvN8Au gDmRPHB6CYAohR2UnFRhKtAfMRhQb2sfML0FQEIoUAeAIZAecDoqUEECQHA6Ly93P+AuMREgYXMu OsAJ8G4uMQmAdS9+EPEEYG55Wi89GkYDYTHjbyqAcvp2CJB3L1UdlD7HN0IgEt5vIYMu0z8hLHBn HyAgsj53BRAnkyFQAIAHkFwngDk3d2VsbC03wOMqYjwhaWRpGMArkyyBfzJBAIAgsQDAOcNHojpj bx9AgCGQDrAkQCThZC1o3G9jKiAOsixyZDcgH0DzSeRAUCBFQwEjQEdCRSb9KiB3IrADoBjAS8Ag oEJy/yFQAYAekgUQMoEqIAEABPL/N8EfMStmOlQukUTxA6ALgHxwdVADA5EIYD+QUxA7f07eUFMe kk/STCEsIU2zc08hoB8gRTVQuyJiANBr/TLiczBgUY9E8gRhBpAIkP8f8FOkTCFFUBEwIrEjEDmw /yQwQrNQUQuALIFS4yogWDLfUzNaKFLjIfUdlExHUypUvzfATwEmMEiBHqEmkGwqgd9FMQJgJKBE 8QUAbwQRIwH/SMAfID8SQtEkYArAQDEkwu84gVMBHmILgGMKQEjQPzL0Wy5lkF0kwh9kUpIzEr0R MHQjQCA1ELAdo31oMAAAAB4ANRABAAAAPQAAADw1RUZENEQ3QUM2MjY1RjREOUQzQTg0OUNFQTky MTkxOTAyMTgyQUQ5QExBWEEuaW50cmEuY2VhLmZyPgAAAAAeADkQAQAAACoAAAA8MjAxMDEyMDkx MTAwMDMuM0MwQjNCQkFGQHlxdWVtLmlucmlhLmZyPgAAAB4ARxABAAAADwAAAG1lc3NhZ2UvcmZj ODIyAAALAPIQAQAAAB8A8xABAAAAVgAAAEQAZQBmAGkAbgBlACAAcABhAHIAcwBlAHIAIABhAG4A ZAAgAHAAcgBpAG4AdABlAHIAIABjAG8AbgBzAGkAcwB0AGUAbgB0AGwAeQAuAEUATQBMAAAAAAAL APYQAAAAAEAABzD7LvfLkZfLAUAACDA78oMXkpfLAQMA3j+vbwAAAwDxPwkEAAAeAPg/AQAAAAwA AABDVU9RIFBhc2NhbAACAfk/AQAAAHAAAAAAAAAA3KdAyMBCEBq0uQgAKy/hggEAAAAAAAAAL089 Q0VBL09VPURJL0NOPURPTUFJTkVTL0NOPURSVC1TQUMvQ049VVRJTElTQVRFVVJTL0NOPVBSRS1F MkszL0NOPUxPVDEvQ049UEMyMDYwNTYAHgD6PwEAAAAVAAAAU3lzdGVtIEFkbWluaXN0cmF0b3IA AAAAAgH7PwEAAAAeAAAAAAAAANynQMjAQhAatLkIACsv4YIBAAAAAAAAAC4AAAADAP0/5AQAAAMA GUAAAAAAAwAaQAAAAAADAB1AAAAAAAMAHkAAAAAAHgAwQAEAAAAJAAAAUEMyMDYwNTYAAAAAHgAx QAEAAAAJAAAAUEMyMDYwNTYAAAAAHgAyQAEAAAAhAAAAY2FtbC1saXN0LWJvdW5jZXNAeXF1ZW0u aW5yaWEuZnIAAAAAHgAzQAEAAAAhAAAAY2FtbC1saXN0LXJlcXVlc3RAeXF1ZW0uaW5yaWEuZnIA AAAAHgA4QAEAAAAJAAAAUEMyMDYwNTYAAAAAHgA5QAEAAAACAAAALgAAAAMAdkD/////CwApAAAA AAALACMAAAAAAAMABhCKch7TAwAHEGoDAAADABAQAQAAAAMAERAAAAAAHgAIEAEAAABlAAAASU1H T0lOR1RPREVGSU5FQVBBUlNFUkFOREFQUklOVEVSRk9SQVNJTVBMRUdSQU1NQVJJU1RIRVJFQVdB WVRPREVGSU5FQk9USE9GVEhFTUlOQVNJTkdMRUNPTlNUUlVDVFVTSQAAAAACAX8AAQAAAD0AAAA8 NUVGRDREN0FDNjI2NUY0RDlEM0E4NDlDRUE5MjE5MTkwMjE4MkFEOUBMQVhBLmludHJhLmNlYS5m cj4AAAAAjfM= ------_=_NextPart_001_01CB9792.1775A413--