2010-06-29 14 views
5

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

4

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.

+0

Cosa fa questo esempio motivante? – aneccodeal

+0

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

+0

Una discussione attiva sulle risorse per imparare camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/1751a2c308742ac3?hl=it – nlucaroni

2

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.

+0

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

1

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.

0

È possibile utilizzare compiler-libs per ottenere ciò. Vedere Parsetree, Asttypes e Ast_helper.