2

我在我的 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
...

在代码中,我正在键入以在引用中使用派生语法。但似乎预处理器不理解引用中“<”和“>”比较运算符的存在。如果我Show.show<int>在另一个文件中使用不带引号的语法,它编译时不会出错。

我已经看到了解决问题的解决方案,-pp overrides the effect of -syntax但我不明白。有人可以向我解释一下或提出其他解决方法吗?

4

1 回答 1

0

既然您发布了代码片段,我相信问题在于您在引号内使用了 Camlp4 扩展。我需要检查在一般情况下是否允许这样做(存在一个问题,即引号解析器是否使用预定义的解析器,或者是否还使用传递给编译器的先前扩展进行扩展),以及您是否使用特定扩展re using 与修改后的语法一起工作,您通过调用camlp4orf(来使用它or意味着环境代码采用原始语法,而引用代码采用修改后的语法,有时在引用中更喜欢这种语法,因为它不那么模棱两可——f表示“完整”,通常的扩展(流解析器等)被激活)。

如果“派生”不被认为是用在修改后的语法中,那么修改后的引用可能根本不起作用。无论如何,这可能是 Camlp4 特有的问题,而不是与 ocamlbuild 相关的问题。

于 2013-05-15T21:44:45.257 回答