Thanks for your suggestion Gabriel! If I change the extension of my parser to mlypack, ocamlbuild fails to use it correctly:
[gesundheit:~/w/ocaml-r 17:05]$make
ocaml setup.ml -build
Finished, 0 targets (0 cached) in 00:00:00.
+ ocamlfind ocamlc -c -g -package camlp4 -package camlp4.extend -package camlp4.lib -package camlp4.quotations -package camlp4.quotations.o -syntax camlp4o -I src/syntax -o src/syntax/r_lang_lexer.cmo src/syntax/r_lang_lexer.ml
File "src/syntax/r_lang_lexer.mll", line 4, characters 2-22:
Error: Unbound module R_lang_parser_y
It's not clear to me either what the mlypack are supposed to be. I'll try to patch the non-modular menhir function in ocamlbuild/ocaml_tools.ml as you suggest.
Thanks again!
ph.
I'm not familiar with this part of ocamlbuild, but a look at
ocamlbuild/ocaml_tools.ml suggest that the different rule named
"menhir_modular" (which creates stuff from a file with extension
".mlypack" rather than ".mly", and which I have never used) has a
slightly more expression -ocamlc option, that includes (T
ocamlc_tags), which includes in particular the tags for the .mlypack
file.
You could try to see if, naming your grammar file .mlypack and adding
a "foo.mlypack: package(camlp4.lib)" to your _tags, you at least get a
satisfying menhir invocation. From there, you could either find out
what this "modular menhir" mode is and how to use it in your case, or
suggest patching ocamlbuild to use this (T ocamlc_tags) also in simple
menhir invocations.
On Thu, Sep 20, 2012 at 3:45 PM, Philippe Veber
<philippe.veber@gmail.com> wrote:
> Dear camlers,
>
> I'm currently trying to implement a camlp4 quotation whose contents will be
> parsed using ocamllex and menhir. Everything went unexpectedly well until I
> tried to add antiquotations. Following Tiphaine Turpin's format syntax
> extension (https://forge.ocamlcore.org/projects/format/), an antiquotation
> is parsed as a token in ocamllex, and this token is defined in my parser as:
>
> %token <Camlp4.PreCast.Syntax.Ast.expr> EXPR
>
> The thing is when I try to compile my project with ocamlbuild I get the
> following error:
>
> [gesundheit:~/w/ocaml-r 14:46]$make
> ocaml setup.ml -build
> Finished, 0 targets (0 cached) in 00:00:00.
> + menhir --ocamlc 'ocamlfind ocamlc -I src/syntax' --infer
> src/syntax/r_lang_parser_y.mly
> File "src/syntax/r_lang_parser_y.mly", line 7, characters 40-44:
> Warning: the token EXPR is unused.
> File "src/syntax/r_lang_parser_y.mly", line 7, characters 8-38:
> Error: Unbound module Camlp4
> ...
>
> Now I can easily (but manually) fix this by adding the missing -I option for
> camlp4 libs:
>
> [gesundheit:~/w/ocaml-r/_build 15:22]$menhir --ocamlc 'ocamlfind ocamlc -I
> src/syntax -I +camlp4' --infer src/syntax/r_lang_parser_y.mly
> File "src/syntax/r_lang_parser_y.mly", line 7, characters 40-44:
> Warning: the token EXPR is unused.
> [gesundheit:~/w/ocaml-r/_build 15:22]$
>
> My question is how do I tell ocamlbuild to add this option directly? I fear
> the response is "you cannot", if I refer to the piece of code in ocamlbuild
> that generates the call to menhir:
>
> let menhir mly env build =
> let mly = env mly in
> let menhir = if !Options.ocamlyacc = N then V"MENHIR" else
> !Options.ocamlyacc in
> Ocaml_compiler.prepare_compile build mly;
> Cmd(S[menhir;
> A"--ocamlc"; Quote(S[!Options.ocamlc; ocaml_include_flags mly]);
> T(tags_of_pathname mly++"ocaml"++"parser"++"menhir");
> A"--infer"; Px mly])
>
> I fail to see in this function a hook which I could use to inject the
> missing argument. Would any one know a workaround to use tokens that have
> hold a value whose type is not defined in the standard library?
>
> Cheers,
> Philippe.
>
>