运行此程序后 camlp4of ,它产生这个: Ast.StExp (_loc, (Ast.ExAp-6ren">
gpt4 book ai didi

ocaml - 将 OCaml AST 打印为 OCaml 代码

转载 作者:行者123 更新时间:2023-12-04 19:10:08 28 4
gpt4 key购买 nike

我有一段包含camlp4引用的代码。

let f_name = "my_func"
<:str_item< value $lid:f_name$ a = a * 2 >>

运行此程序后 camlp4of ,它产生这个:

  Ast.StExp (_loc,
(Ast.ExApp (_loc,
(Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "=")))),
(Ast.ExApp (_loc,
(Ast.ExApp (_loc,
(Ast.ExId (_loc, (Ast.IdLid (_loc, "value")))),
(Ast.ExId (_loc, (Ast.IdLid (_loc, f_name)))))),
(Ast.ExId (_loc, (Ast.IdLid (_loc, "a")))))))),
(Ast.ExApp (_loc,
(Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "*")))),
(Ast.ExId (_loc, (Ast.IdLid (_loc, "a")))))),
(Ast.ExInt (_loc, "2")))))))

我的问题是,是否有打印生成的 ocaml 代码的方法?什么 camlp4of我应该使用命令还是选项来显示代码?我希望从上面的例子中看到的是:

value my_func a = a * 2

那可能吗?原因是我想做一些调试,看看生成的 ocaml 代码是什么样子的。

最佳答案

这是我几天前问自己的一个好问题。

您可以使用具有类型的`Camlp4.PreCast.Printers.OCaml.print_implem

value print_implem : ?input_file:string -> ?output_file:string ->
Ast.str_item -> unit;

例如,在顶层(只显示最后一个命令的输出):
# #use "topfind";;
# #require "camlp4";;
# #load "camlp4of.cma";;
# open Camlp4.PreCast;;
# let _loc = Loc.ghost;;
# let test =
let f_name = "my_func" in
<:str_item< value $lid:f_name$ a = a * 2 >>;;
# Printers.OCaml.print_implem test;;
let _ = (value my_func a) = (a * 2);;
- : unit = ()

另一种解决方案是制作一个语法扩展来生成您正在寻找的输出。例如,一个 Camlp4AstFilter 会忽略它的输入,并将你的东西作为输出返回,所以你可以使用 camlp4of my_filter.cmo -str ''获得您正在寻找的 AST。

关于ocaml - 将 OCaml AST 打印为 OCaml 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15728271/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com