Возможно ли получить AST для программы OCaml?

Я хотел бы иметь возможность получить AST для данной программы OCaml (например, я хотел бы пройтись по AST и сгенерировать инструментальную версию кода или выполнить какое-то преобразование). Поддерживает ли какой-либо из инструментов OCaml эту функцию?


person aneccodeal    schedule 29.06.2010    source источник
comment
Я думаю, что принятый ответ устарел (camlp4 не поддерживается с 2017 года); Я бы принял один из двух последних ответов с упоминанием ppxs или compiler-libs.   -  person Ulugbek Abdullaev    schedule 21.07.2019


Ответы (4)


Начиная с версии OCaml 4.02.1 можно использовать инструменты PPX, написанные Аленом Фришем, чтобы точно сделать это. Пример:

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

Эту программу также можно использовать для дампа AST обычного файла кода, а различные параметры контролируют степень точности дампа. Например, в приведенном выше примере параметры местоположения AST скрыты.

person Michaël Le Barbier    schedule 11.03.2016

camlp4 — это то, что вам нужно. Вот мотивирующий пример. Документы скудны - это правда, но можно разобраться в вики, существующих примерах, руководства и, возможно, даже исходники camlp4.

person ygrek    schedule 30.06.2010
comment
Что делает этот мотивирующий пример? - person aneccodeal; 30.06.2010
comment
Вставьте вызовы функции co Camlp4prof.count (читай произвольной) в начале каждого анализируемого определения функции, передавая параметры имени и местоположения. - person ygrek; 30.06.2010
comment
Активное обсуждение ресурсов для изучения camlp4: groups.google. .com/group/fa.caml/browse_thread/thread/ - person nlucaroni; 28.09.2010

То, что вы ищете, это [camlp4][1]. Я раньше не использовал camlp4, поэтому не могу подтвердить его достоинства как программного обеспечения. Я слышал о людях, использующих camlp5 [http://pauillac.inria.fr/~ddr/camlp5/], который, согласно википедии, имеет лучшую документацию, чем текущая версия camlp4.

person Axle    schedule 30.06.2010
comment
Я думал, что camlp4 использовался для изменения и настройки синтаксиса OCaml, но я полагаю, что имеет смысл каким-то образом добраться до AST. - person aneccodeal; 30.06.2010

Вы можете использовать compiler-libs для достижения этого. См. Parsetree, Asttypes и Ast_helper.

person tekknolagi    schedule 24.02.2017