1

是否有允许过滤源文件中的注释的 OCaml 工具,类似于gcc -E

理想情况下,我正在寻找可以删除除评论之外的所有内容的东西,但反过来也很有用。

例如,如果有一种方法可以使用camlp4/campl5/ppx 来获取OCaml 注释(包括用单个星号定义的非OCamldoc 注释),我想知道。我在 Camlp4 的 AST 中寻找注释节点并没有取得多大成功(尽管我知道它必须存在,因为甚至存在与 Camlp4 修改它们的位置有关的错误)。

这是一个示例:在以下文件中:

(*** three asterisks *)
let f () =
  Format.printf "end"

let () =
  (* one asterisk (* nested comment *) *)
  Printf.printf "hello world\n";
  (** two asterisks *)
  f();
  ()

我想理想地获得:

(*** three asterisks *)
(* one asterisk (* nested comment *) *)
(** two asterisks *)

它们之间的空格和是否存在(* *)大多无关紧要,但它应该保留各种评论。我的直接目的是能够将其过滤到拼写检查器中,但清理评论(即有一个只删除评论的过滤器)也很有用:我可以清理评论,然后使用它diff来获取已删除的内容。

4

3 回答 3

1

""我用 camlp5 做了一些有趣的实验,与任何代码项的漂亮打印想法一起玩。以下代码:

let ignore _ _ _ = ""

let rule f = Extfun.(extend f [Evar (),false, fun _ -> Some ignore])

let () =
  Eprinter.extend Pcaml.pr_str_item None [ None, rule ];
  Eprinter.extend Pcaml.pr_sig_item None [ None, rule ]

将禁用任何str_item(即模块实现的顶级项目)或sig_item(模块接口的顶级项目)的漂亮打印,方法是扩展相应的默认打印机,其中包含rule为 any 输出空字符串的 catch-all str_item。编译pr_comment.ml_

ocamlfind ocamlc -c -package camlp5 pr_comment.ml

并将其用作

camlp5o pr_o.cmo path/to/pr_comment.cmo -o only_comment.ml my_file.ml
于 2017-02-06T11:59:42.997 回答
1

您可以将ocamldoc与自定义生成器一起使用,该生成器将使用文本表示形式转储注释。

于 2017-02-03T19:03:21.960 回答
0

好吧,现在有一个基于ocamlwc的词法分析器,它可以去除代码中除注释之外的所有内容,称为ocaml-comment-sieve。它基于ocamlwc.

但是,这个工具是 GPL 许可的(因为它是从ocamlwcGPL 许可的 衍生而来的),所以它不能在这里发布。尽管如此,它确实满足了我的要求,所以在有人提出更好的方法之前,我会将其视为答案。

于 2017-02-09T12:31:01.633 回答