使用ocamlbuild在Camlp4中使用OCaml语法扩展

时间:2013-05-14 08:22:24

标签: ocaml ocamlbuild camlp4

我在使用camlp4解析器中的deriving-ocsigen语法扩展时遇到问题。我的解析器名为pa_debug.ml

这是标签文件:

<pa_debug.ml>: pp(camlp4orf.opt), package(deriving-ocsigen.syntax), syntax(camlp4o)

使用

编译时
ocamlbuild -libs dynlink,camlp4lib,deriving -cflags -I,+camlp4,-dtypes -lflags -I,+camlp4,-dtypes -use-ocamlfind pa_debug.cmo

我收到以下错误:

Warning: -pp overrides the effect of -syntax partly
File "pa_debug.ml", line 103, characters 66-67:
While expanding quotation "expr" in a position of "expr":
Parse error: [expr] expected after [infix operator (level 0) (comparison operators, and some others)] (in [expr])

错误发生在此代码段的第二行:

...
let fun_id = get_fun_id bi in
let app = <:expr< Debug.ho_1 $str:fun_id$ (Show.show<int>) (Show.show<int>) >> in
let debug_fun_body = mk_appln _loc app new_patts in
...

在代码中,我正在键入以在引号中使用deriving的语法。但似乎预处理器不理解“&lt;”的存在和“&gt;”报价中的比较运算符。如果我在没有引号的另一个文件中使用Show.show<int>语法,则编译时没有错误。

我见过solution来修复-pp overrides the effect of -syntax问题,但我不明白。有人可以向我解释或建议其他方法来解决它吗?

1 个答案:

答案 0 :(得分:0)

现在您已发布了代码段,我认为问题在于您在引号内使用了Camlp4扩展。我需要检查是否允许在一般情况下(有一个问题是引用解析器是否使用预定义的解析器,或者是否也扩展了传递给编译器的先前扩展),还有特定扩展是否是你的'重新使用修改后的语法,通过调用camlp4orfor表示环境代码是原始语法,而引用代码是修订后的语法,有时使用引用中的首选因为它不太模糊 - f表示“完整”,通常的扩展(流解析器等)被激活。

如果认为“推导”不被用于修订语法,则修改后的引用可能根本不起作用。在任何情况下,这可能是Camlp4特有的问题,而不是与ocamlbuild相关的问题。