Excerpts from Hendrik Tews's message of Thu Apr 03 23:24:17 +0200 2008: > "Nicolas Pouillard" 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. Yes. > > I have a followup question. With the functorial interface I can > build and use several grammars at the same time. For instance Yes. > 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. Yes. > 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