2017-02-03 3 views
1

Existe-t-il un outil OCaml permettant de filtrer les commentaires dans les fichiers source, similaire à gcc -E?Lexer/filter for comments

Idéalement, je cherche quelque chose qui va supprimer tout mais commentaires, mais l'inverse serait également utile. Par exemple, s'il y a un moyen d'utiliser camlp4/campl5/ppx pour obtenir des commentaires OCaml (y compris des commentaires non-OCamldoc définis avec un seul astérisque), j'aimerais savoir. Je n'ai pas eu beaucoup de succès à la recherche de nœuds de commentaire dans AST de Camlp4 (bien que je sache qu'il doit exister, car il y a même des bugs liés au fait que Camlp4 modifie leur placement).

Voici un exemple: dans le fichier suivant:

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

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

Je voudrais obtenir idéalement:

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

L'espace entre eux et la présence ou l'absence de (* *) n'a plus d'importance, mais il devrait conserver les commentaires de toutes sortes. Mon objectif immédiat est de pouvoir le filtrer sur un vérificateur d'orthographe, mais nettoyer les commentaires (c'est-à-dire avoir un filtre qui supprime uniquement les commentaires) peut également être utile: je peux nettoyer les commentaires et utiliser diff pour obtenir ce qui a été supprimé.

Répondre

0

Eh bien, il y a maintenant un lexer basé sur ocamlwc que les bandes de tout, mais les commentaires dans le code, appelé ocaml-comment-sieve. Il est basé sur le lexer simple utilisé dans ocamlwc. Toutefois, cet outil est sous licence GPL (car il est dérivé de ocamlwc, sous licence GPL), donc it cannot be posted here. Pourtant, cela répond à mes exigences, donc jusqu'à ce que quelqu'un suggère un meilleur moyen, je le considérerai comme une réponse.

1

Vous pouvez utiliser ocamldoc avec un générateur personnalisé qui va vider les commentaires en utilisant la représentation textuelle.

+0

Malheureusement, il semble que ocamldoc ne tient pas compte des commentaires d'une seule étoile. Si j'utilise 'sed' pour transformer, alors il essaie trop de les analyser, ce qui conduit à plusieurs types d'erreurs. De plus, le fait qu'il nécessite une sorte de configuration de compilation (par exemple, des chemins '-I' pour lui permettre de trouver des fichiers' .cmi', par exemple) le rend assez lourd pour ce que j'ai prévu. – anol

1

J'ai fait quelques expériences intéressantes avec camlp5, en jouant avec l'idée de joli-impression "" pour n'importe quel élément de code. Le code suivant:

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 ] 

désactive la jolie impression de tout str_item (c.-éléments de premier niveau de mise en œuvre du module), soit sig_item (éléments de premier niveau des interfaces de module), par l'extension de l'imprimante par défaut correspondant à un fourre-tout rule que renvoie une chaîne vide pour tout str_item. Compile pr_comment.ml avec

ocamlfind ocamlc -c -package camlp5 pr_comment.ml 

et l'utiliser comme

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

Cela fonctionne pour les commentaires de haut niveau, mais malheureusement pas pour les commentaires à l'intérieur des fonctions, par exemple. Cela résout une partie du problème mais pas tout, donc je suis toujours à la recherche d'une autre solution. – anol

+0

Oui, j'ai remarqué ça.J'ai essayé de jouer un peu plus avec camlp5, mais la documentation est un peu rare sur ce sujet, et je n'ai pas fait beaucoup de progrès. – Virgile