Lexer /过滤评论

时间:2017-02-03 18:48:34

标签: comments ocaml camlp4 ppx

是否有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来获取被删除了。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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(顶层模块接口项)的漂亮打印,方法是使用catch-all扩展相应的默认打印机{{ 1}}为任何rule输出一个空字符串。使用

编译str_item
pr_comment.ml

并将其用作

ocamlfind ocamlc -c -package camlp5 pr_comment.ml

答案 2 :(得分:0)

好吧,现在有一个基于ocamlwc的词法分析器除了代码中的注释之外的所有内容,名为ocaml-comment-sieve。它基于ocamlwc中使用的简单词法分析器。

但是,此工具是GPL许可的(因为它源自ocamlwc,这是GPL许可的),因此it cannot be posted here。尽管如此,它确实满足了我的要求,所以在有人建议更好的方式之前,我会将其视为答案。

相关问题