Я хотел бы иметь возможность получить AST для данной программы OCaml (например, я хотел бы пройтись по AST и сгенерировать инструментальную версию кода или выполнить какое-то преобразование). Поддерживает ли какой-либо из инструментов OCaml эту функцию?
Возможно ли получить AST для программы OCaml?
Ответы (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 скрыты.
camlp4 — это то, что вам нужно. Вот мотивирующий пример. Документы скудны - это правда, но можно разобраться в вики, существующих примерах, руководства и, возможно, даже исходники camlp4.
То, что вы ищете, это [camlp4][1]. Я раньше не использовал camlp4, поэтому не могу подтвердить его достоинства как программного обеспечения. Я слышал о людях, использующих camlp5 [http://pauillac.inria.fr/~ddr/camlp5/], который, согласно википедии, имеет лучшую документацию, чем текущая версия camlp4.
Вы можете использовать compiler-libs
для достижения этого. См. Parsetree
, Asttypes
и Ast_helper
.
ppx
s илиcompiler-libs
. - person Ulugbek Abdullaev   schedule 21.07.2019