Je voudrais être capable d'obtenir l'AST pour un programme OCaml donné (je voudrais parcourir l'AST et générer une version instrumentée du code ou faire une sorte de transformation, par exemple). Est-ce que l'un des outils OCaml supporte cette fonctionnalité?Est-il possible d'obtenir l'AST pour un programme OCaml?
Répondre
camlp4 est un chemin à parcourir. Voici un motivating example. Les docs sont clairsemés - vrai, mais on peut faire son chemin en lisant le wiki, les exemples existants, tutorials, et peut-être même les sources de camlp4.
Ce que vous cherchez est [camlp4] [1]. Je n'ai jamais utilisé camlp4 auparavant, donc je ne peux pas certifier ses vertus en tant que logiciel. J'ai entendu parler de gens utilisant camlp5 [http://pauillac.inria.fr/~ddr/camlp5/] qui, selon wikipedia, a une meilleure documentation que la version actuelle de camlp4.
Je pensais que camlp4 était utilisé pour modifier et personnaliser la syntaxe OCaml, mais je suppose qu'il est logique que cela puisse arriver à l'AST d'une manière ou d'une autre. – aneccodeal
Depuis OCaml 4.02.1, il est possible d'utiliser le PPX tools written bu Alain Frisch pour le faire précisément. Exemple:
% ocamlfind ppx_tools/dumpast -e "1 + 2"
1 + 2
==>
{pexp_desc =
Pexp_apply ({pexp_desc = Pexp_ident {txt = Lident "+"}},
[("", {pexp_desc = Pexp_constant (Const_int 1)});
("", {pexp_desc = Pexp_constant (Const_int 2)})])}
=========
Il est possible d'utiliser ce programme pour vider l'AST d'un fichier de code normal ainsi, et diverses options contrôlent le degré de précision de la décharge. Dans l'exemple ci-dessus, par exemple, les paramètres de localisation de l'AST sont cachés.
Pour cela, vous pouvez utiliser compiler-libs
. Voir Parsetree
, Asttypes
et Ast_helper
.
Que fait cet exemple motivant? – aneccodeal
Insérer des appels co Camlp4prof.count (lire "arbitraire") fonction au début de chaque définition de fonction analysée en passant les paramètres de nom et d'emplacement. – ygrek
Une discussion active sur les ressources pour apprendre camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/1751a2c308742ac3?hl=fr – nlucaroni