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: example/parse_files.ml
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2008-04-04 (13:42)
From: Nicolas Pouillard <nicolas.pouillard@g...>
Subject: Re: [Caml-list] Camlp4: example/parse_files.ml
Excerpts from Hendrik Tews's message of Thu Apr 03 23:24:17 +0200 2008:
> "Nicolas Pouillard" <nicolas.pouillard@gmail.com> writes:
>    > Do I miss
>    >    something if I simplify further to
>    > 
>    >     module Caml =
>    >        Camlp4OCamlParser.Make
>    >     (Camlp4OCamlRevisedParser.Make(Camlp4.PreCast.Syntax))
>    You are applying original and revised parser, so if the
>    current parser is empty that's ok. Otherwise the extension can
>    fail.
> Right, I missed that: With this simplification I am not starting
> with a fresh and empty grammar but with whatever has accumulated
> in PreCast.Syntax.


> I have a followup question. With the functorial interface I can
> build and use several grammars at the same time. For instance


>     module FreshGrammar(Unit : sig end) =
>       Camlp4.OCamlInitSyntax.Make
>         (Camlp4.PreCast.Ast)(Camlp4.PreCast.Gram)(Camlp4.PreCast.Quotation)
>     module G1 = FreshGrammar(struct end)
>     module M1 = Camlp4OCamlRevisedParser.Make(G1)
>     module M2 = Camlp4OCamlParser.Make(G1)
>     module G2 = FreshGrammar(struct end)
>     module M3 = Camlp4OCamlRevisedParser.Make(G2)
>     module M4 = Camlp4MacroParser.Make(G2)  
> Now G1.parse_implem parses Ocaml syntax, while G2.parse_implem
> parses revised syntax with macros.


> Can I do the same with a syntax extention that is only loaded at
> runtime via Dynlink? Assume a syntax extention X that is only
> available at runtime and not at compiletime. After loading X with
> Dynlink, all I can do is invoke the callback of X, but this will
> add the grammar extension of X to Camlp4.PreCast.Syntax. 

You  can  do  it  but  you  will to resort to some kind of registering of your
extensions, as it's done in camlp4 for the default grammar.

> Is there a way to obtain two functions parse_implem (as above)
> that mix X with different syntaxes (eg Ocaml + X and 
> Revised + X)? For that, I believe, it would be necessary to
> extract parse_implem from a syntax module such that it survives
> clearing that Syntax.

Yes   but   your   extension  X  has  to  be  a  functor,  then  you  can  get
X(OCamlOriginal), X(OCamlRevised).

Nicolas Pouillard aka Ertai