From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=AWL,DNS_FROM_RFC_ABUSE, DNS_FROM_RFC_POST autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id B1DE2BB84 for ; Tue, 6 Jan 2009 23:50:10 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AroBAGJvY0nZkrEGmWdsb2JhbACUBgEBAQEBCAsKBxGuAIEpCIwUBYQ6CA X-IronPort-AV: E=Sophos;i="4.37,222,1231110000"; d="ml'?sh'?scan'208";a="33378914" Received: from web27006.mail.ukl.yahoo.com ([217.146.177.6]) by mail4-smtp-sop.national.inria.fr with SMTP; 06 Jan 2009 23:49:42 +0100 Received: (qmail 35877 invoked by uid 60001); 6 Jan 2009 22:49:41 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.fr; h=X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:MIME-Version:Content-Type:Message-ID; b=N4QIjEmzdHpai21b9/iCBHQe+HLrwXyGO2AeaBXUtOU4tOGhJIaloZ/KMRIh7F8HRRc51+4z9HFagPAM9qZpndJJeShGgwmig91JEkcNXP3u2x0ufa25DwcwRI0chYpC4XNUmo6Ez05pvaiAS+5wsBeiZ0Ng1dpeOXX7DRlsoDY=; X-YMail-OSG: 7WqRibQVM1kxw1ff.WSaitmdoJ45LKCoLnEp1NMzDKOgv65PFPZV8rp_vlB7GJ.2PD6KhsNiJyb4_I5Yt8_gBxWnCQ8eflRrOmaUtLiDxKeH4kM4X6NsNefQkaQ34oWs6cTmn09_iW8e8w9DAsFfZqGWsOXlqhqYHNmkgKwSytoNnClx4M0yl8DyP8NJY28PpMb42FzIkzm.vgb6uA.BcdZfmakr Received: from [79.114.32.37] by web27006.mail.ukl.yahoo.com via HTTP; Tue, 06 Jan 2009 22:49:41 GMT X-Mailer: YahooMailRC/1155.45 YahooMailWebService/0.7.260.1 References: <4b5157c30901060603k6d0589d2m469b170dc5ec7c8e@mail.gmail.com> <007001c97011$33012dc0$99038940$@com> <4963C8AD.8010206@ens-lyon.org> Date: Tue, 6 Jan 2009 22:49:41 +0000 (GMT) From: Matthieu Wipliez Subject: Re : [Caml-list] Parsing simple type expressions To: caml-list@yquem.inria.fr MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1153762586-1231282181=:35746" Message-ID: <524796.35746.qm@web27006.mail.ukl.yahoo.com> X-Spam: no; 0.00; matthieu:01 camlp:01 runtime:01 syntax:01 ocaml:01 syntax:01 parses:01 camlp:01 parser:01 parser:01 parsers:01 ctyp:01 mlast:01 ocaml:01 cheers:01 X-Attachments: cset="utf-8" type="application/octet-stream" name="common.ml" name="common.ml" type="application/octet-stream" name="pa_exp.ml" name="pa_exp.ml" type="application/octet-stream" name="pa_exp_ext.ml" name="pa_exp_ext.ml" type="application/octet-stream" name="build.sh" name="build.sh" --0-1153762586-1231282181=:35746 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Dear caml-list,=0A=0Ahere you can find another way of doing what Paolo want= s to do.=0A=0ABasically the point was to reuse as much (well-tested) code a= s I could, so I tried to use Camlp4 to parse a type definition, and work fr= om there.=0A=0AYou can find in Common the definition of the AST that Paolo = provided us with, along with a string_of function and a parse_type function= overidden at runtime. In Pa_exp_ext a syntax extension extends the OCaml s= tandard syntax with a rule that parses a type and End Of Input, and in Pa_e= xp is the driver that loads:=0A - Camlp4OCamlRevisedParser the revised syn= tax parser,=0A - Camlp4OCamlParser the "normal" syntax parser,=0A - and "= pa_exp_ext" our parser.=0A=0AActually, Pa_exp acts as the standard "camlp4"= executable, loading parsers and stuff.=0A=0APlease note that this example = is incomplete because Pa_exp_ext.Make.convert_type does not take into accou= nt the syntax of applied types, which are tranformed using the function "id= ent_of_ctyp" from Camlp4Ast.mlast which I did not have time to code.=0A=0AH= owever it is my belief that these files provide a (very interesting) comple= te example of how camlp4 can be used to parse parts of OCaml syntax without= having to write the syntax rules over and over, while using the mysterious= quotations :-)=0A=0AHaving spent a couple of hours on this, I hope this he= lps anyone that is having a look at camlp4 to do what they would like to do= ,=0A=0ACheers and la multi ani "happy new year",=0AMatei=0A=0A=0A=0A----- M= essage d'origine ----=0A> De : Martin Jambon = =0A> =C3=80 : David Allsopp =0A> Cc : OCaml mailing= list ; Paolo Donadeo =0A> E= nvoy=C3=A9 le : Mardi, 6 Janvier 2009, 23h10mn 05s=0A> Objet : Re: [Caml-li= st] Parsing simple type expressions=0A> =0A> David Allsopp wrote:=0A> > oca= mlyacc - you can get most of it for free out of parsing/parser.mly in the = =0A> OCaml sources... the section on type expressions starts at line 1144 f= or OCaml =0A> 3.11.0.=0A> =0A> Our json-wheel library is a complete example= :=0A> =0A> http://martin.jambon.free.fr/json-wheel.html=0A> =0A> =0A> Marti= n=0A> =0A> >> -----Original Message-----=0A> >> From: caml-list-bounces@yqu= em.inria.fr [mailto:caml-list-=0A> >> bounces@yquem.inria.fr] On Behalf Of = Paolo Donadeo=0A> >> Sent: 06 January 2009 14:04=0A> >> To: OCaml mailing l= ist=0A> >> Subject: [Caml-list] Parsing simple type expressions=0A> >>=0A> = >> For a serializer I'm writing I need to parse simple OCaml type=0A> >> ex= pressions composed by OCaml basic types, tuples, options and lists.=0A> >> = Given a string like "(int * string option) list" and this type:=0A> >>=0A> = >> type types =3D=0A> >> | Int=0A> >> | String=0A> >> | Float=0A> >> = | Char=0A> >> | Bool=0A> >> | Option of types=0A> >> | List of type= s=0A> >> | Tuple of types list=0A> >>=0A> >> the function I need should r= eturn something like List (Tuple ([Int;=0A> >> Option(String)]))=0A> >>=0A>= >> Before starting with low level sscanf functions I looked at the Genlex= =0A> >> module, but it wasn't so inspiring. Then I tried with Camlp4 but th= e=0A> >> documentation doesn't really shine :-)=0A> >>=0A> >> So is there a= simple way to write this function using some standard=0A> >> module?=0A> >= >=0A> >> TIA,=0A> >>=0A> >>=0A> >> --=0A> >> Paolo=0A> >> ~=0A> >> ~=0A> >>= :wq=0A> =0A> -- =0A> http://mjambon.com/=0A> =0A> ________________________= _______________________=0A> Caml-list mailing list. Subscription management= :=0A> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list=0A> Archives= : http://caml.inria.fr=0A> Beginner's list: http://groups.yahoo.com/group/o= caml_beginners=0A> Bug reports: http://caml.inria.fr/bin/caml-bugs=0A=0A=0A= =0A --0-1153762586-1231282181=:35746 Content-Type: application/octet-stream; name="common.ml" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="common.ml" dHlwZSB0eXBlcyA9CiAgfCBJbnQKICB8IFN0cmluZwogIHwgRmxvYXQKICB8 IENoYXIKICB8IEJvb2wKICB8IE9wdGlvbiBvZiB0eXBlcwogIHwgTGlzdCBv ZiB0eXBlcwogIHwgVHVwbGUgb2YgdHlwZXMgbGlzdAoKbGV0IHJlYyBzdHJp bmdfb2ZfdHlwZSA9IGZ1bmN0aW9uCiAgfCBJbnQgLT4gImludCIKICB8IFN0 cmluZyAtPiAic3RyaW5nIgogIHwgRmxvYXQgLT4gImZsb2F0IgogIHwgQ2hh ciAtPiAiY2hhciIKICB8IEJvb2wgLT4gImJvb2wiCiAgfCBPcHRpb24gdHlw ZXMgLT4gc3RyaW5nX29mX3R5cGUgdHlwZXMgXiAiIG9wdGlvbiIKICB8IExp c3QgdHlwZXMgLT4gc3RyaW5nX29mX3R5cGUgdHlwZXMgXiAiIGxpc3QiCiAg fCBUdXBsZSB0eXBlcyAtPgogICAgbGV0IHR1cCA9IFN0cmluZy5jb25jYXQg IiAqICIgKExpc3QubWFwIHN0cmluZ19vZl90eXBlIHR5cGVzKSBpbgogICAg IigiIF4gdHVwIF4gIikiCgpsZXQgcGFyc2VfdHlwZSA6IChzdHJpbmcgLT4g dW5pdCkgcmVmID0gcmVmIChmdW4gXyAtPiAoKSkK --0-1153762586-1231282181=:35746 Content-Type: application/octet-stream; name="pa_exp.ml" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pa_exp.ml" b3BlbiBDYW1scDQKb3BlbiBQcmVDYXN0Cm9wZW4gUHJpbnRmCiAgCmxldCBf ID0KICBsZXQgZGwgPSBEeW5Mb2FkZXIubWsgKCkgaW4KICBEeW5Mb2FkZXIu bG9hZCBkbCAiQ2FtbHA0T0NhbWxSZXZpc2VkUGFyc2VyLmNtbyI7CiAgRHlu TG9hZGVyLmxvYWQgZGwgIkNhbWxwNE9DYW1sUGFyc2VyLmNtbyI7CiAgRHlu TG9hZGVyLmxvYWQgZGwgInBhX2V4cF9leHQuY21vIjsKICAKICBMaXN0Lml0 ZXIgcHJpbnRfZW5kbGluZSAhUmVnaXN0ZXIubG9hZGVkX21vZHVsZXM7CiAg UmVnaXN0ZXIuaXRlcl9hbmRfdGFrZV9jYWxsYmFja3MKICAgIChmdW4gKG5h bWUsIG1vZHVsZV9jYWxsYmFjaykgLT4KICAgICAgbW9kdWxlX2NhbGxiYWNr ICgpKTsKICAoKnBhcnNlX3R5cGUgImludCAqIHN0cmluZyBvcHRpb24gbGlz dCI7CiAgcGFyc2VfdHlwZSAiKGludCAqIHN0cmluZyBvcHRpb24pIGxpc3Qi OyopCiAgdHJ5CiAgICAhQ29tbW9uLnBhcnNlX3R5cGUgImludCBvcHRpb24i CiAgd2l0aCBMb2MuRXhjX2xvY2F0ZWQgKGxvYywgZSkgLT4KICAgICAgcHJp bnRfZW5kbGluZSAoTG9jLnRvX3N0cmluZyBsb2MpOwoJICBwcmludF9lbmRs aW5lIChQcmludGV4Yy50b19zdHJpbmcgZSkKICB8IGUgLT4gCgkgIHByaW50 X2VuZGxpbmUgKFByaW50ZXhjLnRvX3N0cmluZyBlKQogIAo= --0-1153762586-1231282181=:35746 Content-Type: application/octet-stream; name="pa_exp_ext.ml" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pa_exp_ext.ml" b3BlbiBDYW1scDQKb3BlbiBQcmVDYXN0Cm9wZW4gUHJpbnRmCiAKbW9kdWxl IElkID0gc3RydWN0CiAgbGV0IG5hbWUgPSAicGFfZXhwIgogIGxldCB2ZXJz aW9uID0gIjEuMCIKZW5kCgptb2R1bGUgTWFrZSAoU3ludGF4IDogU2lnLkNh bWxwNFN5bnRheCkgPSBzdHJ1Y3QKICBvcGVuIFNpZwogIGluY2x1ZGUgU3lu dGF4CgogIGxldCBydHl1aW8gPSBHcmFtLkVudHJ5Lm1rICJydHl1aW8iCgog IGxldCByZWMgY29udmVydF90eXBlID0gZnVuY3Rpb24KICB8IDw6Y3R5cDwg JGxpZDppJCA+PiB3aGVuIGkgPSAiaW50IiAtPiBDb21tb24uSW50CiAgfCA8 OmN0eXA8ICRsaWQ6aSQgPj4gd2hlbiBpID0gInN0cmluZyIgLT4gQ29tbW9u LlN0cmluZwogIHwgPDpjdHlwPCAkbGlkOmkkID4+IHdoZW4gaSA9ICJmbG9h dCIgLT4gQ29tbW9uLkZsb2F0CiAgfCA8OmN0eXA8ICRsaWQ6aSQgPj4gd2hl biBpID0gImNoYXIiIC0+IENvbW1vbi5DaGFyCiAgfCA8OmN0eXA8ICRsaWQ6 aSQgPj4gd2hlbiBpID0gImJvb2wiIC0+IENvbW1vbi5Cb29sCiAgfCA8OmN0 eXA8ICR0MSQgJHQyJCA+PiAtPgogICAgbGV0IHQgPSBjb252ZXJ0X3R5cGUg dDIgaW4KICAgIChtYXRjaCB0MSB3aXRoCgl8IDw6Y3R5cDwgJGxpZDppJCA+ PiB3aGVuIGkgPSAib3B0aW9uIiAtPiBDb21tb24uT3B0aW9uIHQKCXwgPDpj dHlwPCAkbGlkOmkkID4+IHdoZW4gaSA9ICJsaXN0IiAtPiBDb21tb24uTGlz dCB0Cgl8IF8gLT4gZmFpbHdpdGggIm9ubHkgb3B0aW9uIGFuZCBsaXN0IGFs bG93ZWQgZm9yIHR5cGUgYXBwbGljYXRpb24iKQogIHwgXyAtPiBmYWlsd2l0 aCAidGhpcyBjYXNlIGlzIG5vdCByZXByZXNlbnRhYmxlIHVzaW5nIHRoaXMg QVNUIgoKICAoKiBHcmFtbWFyIGRlZmluaXRpb24gKikKICBFWFRFTkQgR3Jh bQogIAogICAgcnR5dWlvOiBbCiAgCQlbIHQgPSBjdHlwOyBFT0kgLT4gY29u dmVydF90eXBlIHQgXQogIAldOwoKICBFTkQKICAKICBsZXQgbXlfcGFyc2Vf dHlwZSBzdHIgPQogICAgcHJpbnRfZW5kbGluZSAoQ29tbW9uLnN0cmluZ19v Zl90eXBlIChHcmFtLnBhcnNlIHJ0eXVpbyAoTG9jLm1rIHN0cikgKFN0cmVh bS5vZl9zdHJpbmcgc3RyKSkpCgogIGxldCBfID0KICAgIENvbW1vbi5wYXJz ZV90eXBlIDo9IG15X3BhcnNlX3R5cGUKZW5kCiAgCmxldCBfPQogIGxldCBt b2R1bGUgTSA9IFJlZ2lzdGVyLk9DYW1sU3ludGF4RXh0ZW5zaW9uIChJZCkg KE1ha2UpIGluICgp --0-1153762586-1231282181=:35746 Content-Type: application/octet-stream; name="build.sh" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="build.sh" IyEvYmluL3NoCm9jYW1sYyAtZyAtYyBjb21tb24ubWwKb2NhbWxjIC1nIC1j IC1JICtjYW1scDQgcGFfZXhwLm1sCm9jYW1sYyAtZyAtYyAtSSArY2FtbHA0 IC1wcCBjYW1scDRvZiBwYV9leHBfZXh0Lm1sCm9jYW1sYyAtZyAtbyBwYV9l eHAuZXhlIC1JICtjYW1scDQgZHlubGluay5jbWEgY2FtbHA0ZnVsbGxpYi5j bWEgY29tbW9uLmNtbyBwYV9leHAuY21vIA== --0-1153762586-1231282181=:35746--