English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

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: 2008-03-21 (15:06)
From: Richard Jones <rich@a...>
Subject: camlp4 question: Mixing a printer and Ast.fold
I'm trying to translate Sylvain Le Gall's gettext module to use camlp4
from ocaml 3.10.0.  The module is a printer which folds over the AST
looking for certain types of function call by name.  A simplified
version is shown below.

This program is supposed to look for all instances of a function named
f applied to a string.

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.

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

module Make (Syntax : Camlp4.Sig.Syntax)
  : Camlp4.Sig.Printer(Syntax.Ast).S =
  module Loc = Syntax.Loc
  module Ast = Syntax.Ast

  class visitor = object
    inherit Ast.fold as super

    val t = []
    method t = t

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

    | e -> super#expr e

  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

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

ocamlc -I +camlp4 -I /usr/lib64/ocaml/camlp4/Camlp4Parsers -pp camlp4of.opt camlp4lib.cma test.ml -o test.cmo
File "test.ml", line 19, characters 19-19:
Unbound constructor Ast.ExApp

Please let me know how to compile this before I go mad...


Richard Jones
Red Hat