我正在试图找出如何传递一个可执行文件的位置,以便作为ppx过滤器运行到OCaml编译器ocamlc/ocamlopt中。
我的问题基本上是
cppo的情况下,如何配置它以接受所需的格式并发出所需的格式?cat不能作为“身份筛选器”使用任何过滤器产生相同的结果?例如,这里有一个简单的OCaml程序。
(* foo.ml *)
let hi = ();;
Printf.printf "hi there\n"使用一个非常简单的过滤器cat,我们可以看到过滤器作为输入应该处理什么样的事情。
$ ocamlopt -ppx cat foo.ml | cat -v
Caml1999M019M-^DM-^U??^@^@^@^G^@^@^@^A^@^@^@^C^@^@^@^B&foo.m
...
File "foo.ml", line 1:
Error: External preprocessor does not produce a valid file它看起来像是某种二进制格式,也许是AST表示?
cppo没有配置它的选项,在使用显式文件调用时处理文本OCaml源文件。我有点困惑,为什么它在以这种方式调用时会发出#line指令.我相信这些指令对C编译器有意义,但对OCaml编译器没有意义。
例如:
$ cppo foo.ml
# 1 "foo.ml"
let hi = ();;
Printf.printf "hi there\n"它在作为过滤器调用时工作,为行指令提供<stdin>的文件名。
$ cat foo.ml | cppo
# 1 "<stdin>"
let hi = ();;
Printf.printf "hi there\n"阅读--help for cppo时,没有提到输入和输出格式,也没有提到像-ppx这样的参数,这有点令人失望。
你该怎么办才能把所有的碎片缝在一起?
发布于 2018-04-03 21:10:08
Ocaml编译器支持两个不同的预处理器系列:使用-pp选项调用的文本预处理器和用-ppx选项调用的(二进制) AST预处理器。
文本预处理程序需要将文本源文件的名称作为输入,并在stdout上输出OCaml源文件或OCaml二进制文件。对于这些,cat确实实现了标识映射:ocamlc -pp cat≡ocamlc。这些预处理器的一个重要限制是它们不能链接在一起。
相反,AST预处理程序将输入-ppx二进制文件的名称和输出二进制AST文件的名称作为输入。换句话说,在这种情况下,标识映射可以用cp:ocamlc -ppx cp≡ocamlc实现。由于这些预处理器的输入和输出都是二进制AST,所以可以将多个ppx预处理器链接在一起。
cppo预处理程序确实属于第一个系列,需要使用-pp调用。
发布于 2018-03-31 03:08:08
事实证明,我将ppx参数(包括扩展点)与camlp4 (或者可能是camlp5,在那里命名很奇怪,我并不完全理解)混为一谈。
在编译器前面放置camlp4过滤器的正确咒语似乎带有-pp标志。
以下命令都会生成a.out
$ ocamlc foo.ml
$ ocamlc -pp cat foo.ml
$ ocamlc -pp cppo foo.ml有些令人惊讶的是,即使输出是空的,这也是有效的。
$ ocamlc -pp /usr/bin/true foo.ml以下命令都不会发出有效的OCaml,也不会产生任何结果
$ ocamlc -pp /usr/bin/false foo.ml
File "foo.ml", line 1:
Error: Error while running external preprocessor
$ ocamlc -pp /usr/bin/rev foo.ml
File "/var/.../ocamlpp27e608", line 1, characters 2-3:
Error: Syntax errorhttps://stackoverflow.com/questions/49583700
复制相似问题