5

我希望能够为给定的 OCaml 程序获取 AST(例如,我想遍历 AST 并生成代码的检测版本或进行某种转换)。是否有任何 OCaml 工具支持此功能?

4

4 回答 4

4

camlp4是一种方法。这是一个鼓舞人心的例子。文档很少——确实如此,但可以通过 wiki、现有示例、教程,甚至可能是 camlp4 源来阅读。

于 2010-06-30T07:22:30.330 回答
3

从 OCaml 4.02.1 开始,可以使用由Alain Frisch 编写的 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 的位置参数是隐藏的。

于 2016-03-11T18:30:26.600 回答
2

您正在寻找的是 [camlp4][1]。我以前没有使用过camlp4,所以我无法证明它作为软件的优点。我听说有人使用camlp5 [ http://pauillac.inria.fr/~ddr/camlp5/],根据维基百科,它比当前版本的camlp4有更好的文档。

于 2010-06-30T02:55:48.837 回答
2

您可以使用compiler-libs来实现这一点。请参阅ParsetreeAsttypesAst_helper

于 2017-02-24T19:20:44.047 回答