Я хотел бы получить AST для данной программы OCaml (я хотел бы пройти AST и сгенерировать инструментальную версию кода или сделать какое-то преобразование, например). Поддерживает ли какой-либо из инструментов OCaml эту функцию?Возможно ли получить AST для программы OCaml?
ответ
camlp4 - это путь. Вот motivating example. Документы разрежены - правда, но можно прочесть его через вики, существующие примеры, tutorials и, возможно, даже источники camlp4.
Что вы ищете [camlp4] [1]. Я раньше не использовал camlp4, поэтому я не могу подтвердить его достоинства как программного обеспечения. Я слышал о людях, использующих camlp5 [http://pauillac.inria.fr/~ddr/camlp5/], который, согласно википедии, имеет лучшую документацию, чем текущая версия camlp4.
Я думал, что camlp4 использовался для изменения и настройки синтаксиса OCaml, но я полагаю, что имеет смысл, что он может как-то добраться до AST. – aneccodeal
С OCaml 4.02.1 можно точно использовать PPX tools written bu Alain Frisch. Пример:
% 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 нормального кода файла, а также и различные варианты управления степенью точности отвала. В приведенном выше примере, например, параметры местоположения АСТ скрыты.
Для этого вы можете использовать compiler-libs
. См. Parsetree
, Asttypes
и Ast_helper
.
Что делает этот мотивирующий пример? – aneccodeal
Вставляет вызовы co Camlp4prof.count (чтение «произвольной») функции в начале каждого определения анализируемой функции, передающей параметры имени и местоположения. – ygrek
Активное обсуждение ресурсов для изучения camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/1751a2c308742ac3?hl=ru – nlucaroni