Mi piacerebbe essere in grado di ottenere l'AST per un dato programma OCaml (mi piacerebbe percorrere l'AST e generare una versione strumentata del codice o fare una sorta di trasformazione, per esempio). Qualcuno degli strumenti di OCaml supporta questa funzionalità?E 'possibile ottenere l'AST per un programma OCaml?
risposta
camlp4 è un modo per andare. Ecco un motivating example. I documenti sono sparsi - vero, ma si può leggere attraverso wiki, esempi esistenti, tutorials e forse anche sorgenti camlp4.
Quello che stai cercando è [camlp4] [1]. Non ho mai usato camlp4, quindi non posso attestare che è virtù come software. Ho sentito parlare di persone che usano camlp5 [http://pauillac.inria.fr/~ddr/camlp5/] che, secondo wikipedia, ha una documentazione migliore della versione attuale di camlp4.
Pensavo che camlp4 fosse usato per modificare e personalizzare la sintassi di OCaml, ma suppongo che abbia senso che possa arrivare all'AST in qualche modo. – aneccodeal
A partire da OCaml 4.02.1 è possibile utilizzare lo PPX tools written bu Alain Frisch per farlo esattamente. Esempio:
% 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)})])}
=========
E 'possibile utilizzare questo programma per scaricare l'AST di un file di codice normale così, e varie opzioni di controllo il grado di precisione della discarica. Nell'esempio sopra, ad esempio, i parametri di posizione dell'AST sono nascosti.
È possibile utilizzare compiler-libs
per ottenere ciò. Vedere Parsetree
, Asttypes
e Ast_helper
.
Cosa fa questo esempio motivante? – aneccodeal
Inserire le chiamate co Camlp4prof.count (leggere la funzione "arbitraria") all'inizio di ogni definizione di funzione analizzata che passa i parametri nome e posizione. – ygrek
Una discussione attiva sulle risorse per imparare camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/1751a2c308742ac3?hl=it – nlucaroni