2010-06-29 8 views
5

Me gustaría poder obtener el AST para un programa OCaml determinado (me gustaría recorrer el AST y generar una versión instrumentada del código o hacer algún tipo de transformación, por ejemplo). ¿Alguna de las herramientas OCaml admite esta funcionalidad?¿Es posible obtener el AST para un programa OCaml?

Respuesta

4

camlp4 es una manera de hacerlo. Aquí hay un motivating example. Los documentos son escasos, cierto, pero uno puede hacer su camino leyendo wiki, ejemplos existentes, tutorials, e incluso fuentes de camlp4.

+0

¿Qué hace ese ejemplo motivador? – aneccodeal

+0

Insertar llamadas co Función Camlp4prof.count (leer "arbitrario") al comienzo de cada definición de función analizada que pasa nombre y parámetros de ubicación. – ygrek

+0

Una discusión activa sobre los recursos para aprender camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/1751a2c308742ac3?hl=en – nlucaroni

2

Lo que estás buscando es [camlp4] [1]. No he usado camlp4 antes, así que no puedo dar fe de sus virtudes como software. He oído hablar de personas que usan camlp5 [http://pauillac.inria.fr/~ddr/camlp5/] que, de acuerdo con wikipedia, tiene una mejor documentación que la versión actual de camlp4.

+0

Pensé que camlp4 se usó para modificar y personalizar la sintaxis de OCaml, pero supongo que tiene sentido que pueda llegar a la AST de alguna manera. – aneccodeal

1

Desde OCaml 4.02.1 es posible usar el PPX tools written bu Alain Frisch para hacer esto con precisión. Ejemplo:

% 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)})])} 
========= 

Es posible utilizar este programa para volcar el AST de un archivo de código normal, así, y varias opciones controlan el grado de precisión del vertedero. En el ejemplo anterior, por ejemplo, los parámetros de ubicación del AST están ocultos.

0

Puede usar compiler-libs para lograrlo. Consulte Parsetree, Asttypes y Ast_helper.