Lexer/filter 征求意见
Lexer/filter for comments
有没有类似gcc -E
的OCaml工具可以过滤源文件中的注释?
理想情况下,我正在寻找可以删除所有内容的东西 但 评论,但反过来也很有用。
例如,如果有一种方法可以使用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
来获取有什么已删除。
您可以将 ocamldoc 与自定义生成器一起使用,该生成器将使用文本表示转储评论。
我用 camlp5 做了一些有趣的实验,对任何代码项都使用 pretty-printing ""
的想法。以下代码:
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
(模块接口的顶层项目)的漂亮打印,方法是使用 [=26] 扩展相应的默认打印机=] rule
为任何 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
嗯,现在有一个基于 ocamlwc that strips everything but the comments in the code, called ocaml-comment-sieve 的词法分析器。它基于 ocamlwc
.
中使用的简单词法分析器
不过,这个工具是GPL-licensed(因为它是从ocamlwc
派生出来的,也就是GPL-licensed),所以it cannot be posted here。尽管如此,它确实满足了我的要求,所以在有人提出更好的方法之前,我会将其视为答案。
有没有类似gcc -E
的OCaml工具可以过滤源文件中的注释?
理想情况下,我正在寻找可以删除所有内容的东西 但 评论,但反过来也很有用。
例如,如果有一种方法可以使用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
来获取有什么已删除。
您可以将 ocamldoc 与自定义生成器一起使用,该生成器将使用文本表示转储评论。
我用 camlp5 做了一些有趣的实验,对任何代码项都使用 pretty-printing ""
的想法。以下代码:
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
(模块接口的顶层项目)的漂亮打印,方法是使用 [=26] 扩展相应的默认打印机=] rule
为任何 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
嗯,现在有一个基于 ocamlwc that strips everything but the comments in the code, called ocaml-comment-sieve 的词法分析器。它基于 ocamlwc
.
不过,这个工具是GPL-licensed(因为它是从ocamlwc
派生出来的,也就是GPL-licensed),所以it cannot be posted here。尽管如此,它确实满足了我的要求,所以在有人提出更好的方法之前,我会将其视为答案。