Version française
Home     About     Download     Resources     Contact us    
Browse thread
camlp4 question: Mixing a printer and Ast.fold
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jeremy Yallop <jeremy.yallop@e...>
Subject: Re: [Caml-list] camlp4 question: Mixing a printer and Ast.fold
Richard Jones wrote:
> I cannot for the life of me work out how to get this to compile.  I've
> tried about a dozen different variations of the module names, 'open',
> 'include' etc. and got a dozen different errors.

Here's another variation that compiles and seems to work.  I changed the 
following:

    * the argument type to Make from "Syntax" to "Camlp4Syntax"
    * the register functor from "Printer" to "OCamlPrinter"
    * the accumulated value in "expr" from "str" to "singular".

Jeremy.

module Id = struct
   let name = "pr_gettext"
   let version = "$Id$"
end

module Make (Syntax : Camlp4.Sig.Camlp4Syntax)
   : Camlp4.Sig.Printer(Syntax.Ast).S =
struct
   open Syntax

   class visitor = object
     inherit Ast.fold as super

     val t = []
     method t = t

     method expr = function
     | <:expr@loc< f $str:singular$ >> ->
       let t = singular :: t in
       {< t = t >}

     | e -> super#expr e
   end

   let print_interf ?input_file ?output_file _ = ()

   let print_implem ?input_file ?output_file ast =
     let visitor = (new visitor)#str_item in
     let t = (visitor ast)#t in
     List.iter prerr_endline t
end

(* Register the new printer. *)
module M = Camlp4.Register.OCamlPrinter(Id)(Make)