我希望能够获得给定OCaml程序的AST(例如,我想走AST并生成代码的检测版本或进行某种转换)。是否有任何OCaml工具支持此功能?
答案 0 :(得分:4)
camlp4是一种方法。这是一个motivating example。文档稀疏 - 真实,但是人们可以通过wiki,现有示例,tutorials,甚至是camlp4来源阅读。
答案 1 :(得分:2)
您正在寻找的是[camlp4] [1]。我之前没有使用过camlp4,所以我无法证明它作为软件的优点。我听说有人使用camlp5 [http://pauillac.inria.fr/~ddr/camlp5/],根据维基百科,它有比当前版本的camlp4更好的文档。
答案 2 :(得分:2)
自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,各种选项控制转储的精度。例如,在上面的示例中,AST的位置参数是隐藏的。
答案 3 :(得分:0)
您可以使用compiler-libs
来实现此目的。请参阅Parsetree
,Asttypes
和Ast_helper
。