From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Delivered-To: caml-list@yquem.inria.fr Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by yquem.inria.fr (Postfix) with ESMTP id A545ABC75 for ; Thu, 24 Feb 2005 08:02:43 +0100 (CET) Received: from caine.easynet.fr (smarthost161.mail.easynet.fr [212.180.1.161]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id j1O72h5C030897 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Feb 2005 08:02:43 +0100 Received: from asi-62.asi256ip.easynet.fr ([212.180.39.62] helo=micro) by caine.easynet.fr with esmtp (TLS-1.0:RSA_ARCFOUR_SHA:16) (Exim 4.34) id 1D4D1G-00075y-JP; Thu, 24 Feb 2005 08:02:43 +0100 Received: from gildor by micro with local (Exim 4.34) id 1D4D15-0003Tc-GB; Thu, 24 Feb 2005 08:02:31 +0100 Date: Thu, 24 Feb 2005 08:02:31 +0100 To: mulhern Cc: caml-list@yquem.inria.fr Subject: Re: [Caml-list] How to get an AST of OCaml source? Message-ID: <20050224070231.GA13215@gallu.homelinux.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6+20040907i From: Sylvain LE GALL X-Miltered: at nez-perce with ID 421D7C13.001 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; caml-list:01 ast:01 ocaml:01 le-gall:01 wrote:01 ocaml:01 binary:01 ast:01 compiler:01 pointers:01 compiler:01 dumped:01 ocamlc:01 parsing:01 dumped:01 X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on yquem.inria.fr X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.0.2 X-Spam-Level: Hello, On Wed, Feb 23, 2005 at 09:25:59PM -0600, mulhern wrote: > Hi, > > I need to use OCaml source code as input to a tool that generates a > related sort of output. It's not a source-to-source translator; the > code generated will not do what the OCaml source code does. It's not a > pretty printer either, the relationship isn't so direct. I'ld like to > write the tool itself in OCaml and am hoping to use CamlTemplate. > > What is the most direct way to get a useful, easily traversable, > representation of OCaml source code in OCaml? Clearly, there is one > embedded in the various ocaml tools. > > I understand that Camlp4 will dump out a binary AST, which is then > input to the OCaml compiler. If that is the best way to go, could > somebody give me some pointers about how to traverse this AST? I have > been unable to extract the information from the Camlp4 documentation. > > I have also been looking at the OCaml src code distribution. I realize > it's possible to pass the compiler a flag (dparsetree) that will cause > a pretty-printed version of the parse tree to be dumped out. On > examination of compiler.ml I can see how that ast that gets pretty > printed is constructed. Is my best bet to write an ocaml application > that just uses a a large chunk of the ocamlc source code modeling the > application as best I can on the compiler.ml source? > Or would I be better off parsing the pretty-printed stuff that gets > dumped out? Or, could I write my own printer that is not so pretty and > dumps a textual representation that is very easily parsed so that the > AST can be reconstructed and insert that into my local version of > ocamlc? > > I'm sure people have encountered similar problems before. Any advice > based on your experience would be very much appreciated. > Well, i have written a kind of library called ocaml-ast-analyze. It use camlp4 to register a printer of source code. You can inject function to do code analysis using this module and you can be able to analyze certain part of the code. I don't have released this library. If you are intersted in it, i can send you a copy. Can you take a look at the file, and then told me if you want the source ? URL : http://www.gallu.homelinux.org/cgi-bin/viewcvs.cgi/ocaml-ast-analyze/trunk/?root=svn And look at : http://www.gallu.homelinux.org/cgi-bin/viewcvs.cgi/ocaml-gettext/trunk/libgettext-ocaml/pr_gettext.ml?rev=359&root=svn&view=auto for example. Kind regard Sylvain Le Gall ps : it use camlp4, so it is limited to what camlp4 do, for example i should use the same command line as camlp4 invocation...