2017-02-03 64 views
1

是否有OCaml工具允許過濾源文件中的註釋,類似於gcc -ELexer/filter for comments

理想情況下,我正在尋找的東西,將刪除所有評論,但其他方式也將是有益的。

例如,如果有一種方法可以使用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獲取已刪除的內容。

回答

0

好了,現在有基於ocamlwc詞法分析器是去掉一切,但在代碼中的註釋,叫ocaml-comment-sieve。它基於ocamlwc中使用的簡單詞法分析器。

但是,此工具是GPL許可的(因爲它源自ocamlwc,這是GPL許可的),因此it cannot be posted here。儘管如此,它確實滿足了我的要求,所以在有人提出更好的方法之前,我會認爲它是一個答案。

1

您可以使用ocamldoc自定義生成器,該生成器將使用文本表示來轉儲註釋。

+0

不幸的是,ocamldoc似乎不考慮單星評論。如果我使用'sed'進行轉換,它會試圖解析它們,導致出現幾種錯誤。另外,它需要某種編譯設置(例如,'-I'路徑以允許它找到'.cmi'文件),這使得它非常沉重。 – anol

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延長相應的默認打印機爲任何str_item輸出一個空字符串。與

ocamlfind ocamlc -c -package camlp5 pr_comment.ml 

編譯pr_comment.ml並把它作爲

camlp5o pr_o.cmo path/to/pr_comment.cmo -o only_comment.ml my_file.ml 
+1

這可以用於頂層註釋,但不幸的是不適用於函數內部的註釋。它確實解決了部分問題,但不是全部,所以我仍在尋找另一種解決方案。 – anol

+0

是的,我注意到了。我試着用camlp5多玩一點,但在這個話題上文檔有點缺乏,而且我還沒有取得很大的進展。 – Virgile