将Camlp4中的OCaml语法扩展与ocamlbuild一起使用

将Camlp4中的OCaml语法扩展与ocamlbuild一起使用,ocaml,ocamlbuild,camlp4,Ocaml,Ocamlbuild,Camlp4,我在camlp4解析器中使用语法扩展时遇到问题。我的解析器名为pa_debug.ml 以下是标签文件: <pa_debug.ml>: pp(camlp4orf.opt), package(deriving-ocsigen.syntax), syntax(camlp4o) 我得到以下错误: Warning: -pp overrides the effect of -syntax partly File "pa_debug.ml", line 103, characters 66-67

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

以下是标签文件:

<pa_debug.ml>: pp(camlp4orf.opt), package(deriving-ocsigen.syntax), syntax(camlp4o)
我得到以下错误:

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
...
。。。
let fun\u id=加入
让app=>进入
让debug\u fun\u body=mk\u appln\u loc app new\u patts进入
...
在代码中,我输入的是在引号中使用派生的语法。但预处理器似乎不理解引号中是否存在“”比较运算符。如果在另一个没有引号的文件中使用
Show.Show
语法,则编译时不会出错


我看到了一个解决
-pp覆盖了-syntax
问题的方法,但我不理解它。有人能给我解释一下吗,或者提出一些其他的解决方法吗?

既然你发布了你的代码片段,我相信问题在于你在引用中使用了Camlp4扩展。我需要检查在一般情况下是否允许这样做(有一个问题是引号解析器是否使用预定义的解析器,或者是否也使用传递给编译器的以前的扩展进行扩展),以及您使用的特定扩展是否与修改后的语法一起工作,通过调用
camlp4orf
表示环境代码采用原始语法,而引用中的代码采用修订语法,这在引用中有时是首选的,因为它不太含糊--
f
表示“完整”,通常的扩展(流解析器等)被激活)


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

如果我们能够访问
pa_debug.ml
文件,尝试查看哪些编译行实际工作,就会更容易提供帮助。我能说的是,您对
ocamlbuild
的使用非同寻常:它应该是一个高级编译管理器,而您对
-cflags-I.
的使用似乎是在尝试不使用
ocamlbuild
。我怀疑如果您使用这些低级选项(例如,
ocamlfind
),或者以更自然的方式使用
ocamlbuild
的标记功能,那么效果会更好。@gasche我不确定ocamlbuild是如何工作的。你是说我应该删除整个
-cflags…
选项吗?我认为有更好的方法来做你的
-clfags
所做的事情;有关如何查找要改用的
ocamlbuild
标记的信息,请参阅。不过,我不是说你应该盲目地移除它们。我不明白你的最后一句话。如果派生是在修订后的语法中,这是否意味着我可以在引号中使用它?实际上,我尝试在引号之外使用派生的
Show.Show
语法,但它不起作用。这是否与
-pp覆盖了-syntax部分
警告的效果有关?
...
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
...