compiler-construction - 如何在 OCaml 编译器中遍历类型化抽象语法树

标签 compiler-construction ocaml abstract-syntax-tree ocamlbuild

我正在尝试转储 OCaml 项目中所有标识符的类型信息,基本上它与遍历类型化抽象语法树(https://github.com/ocaml/ocaml/blob/trunk/typing/typedtree.mli)相同。由于我是 OCaml 编译器代码库的新手,我不确定编译器是否提供了 api,因此我们可以轻松编写插件来完成这项工作,或者我们必须破解编译器代码?此外,这如何与 OCamlbuild 交互?感谢您的任何提示或建议。

最佳答案

假设您已经获得了类型为 structure 的类型化 AST不知何故。

经典的方法就是自己写一个大的递归函数来遍历AST。

但是现在有模块TypedtreeIter在 OCaml 编译器源代码中可用,它暴露于 compiler-libs .对于简单的遍历,这非常方便。
TypedtreeIter提供了一个仿函数来在类型化 AST 上构建您自己的迭代器。这是一个非常简单的示例,用于打印所有模式标识符及其类型:

(* ocamlfind ocamlc -package compiler-libs.common -c example.ml *)
open Typedtree
open TypedtreeIter

module MyIteratorArgument = struct
  include DefaultIteratorArgument

  let enter_pattern p = match p.pat_desc with
    | Tpat_var (id, _) ->
        Format.printf "@[<2>%s@ : %a@]@."
          (Ident.name id)
          Printtyp.type_scheme p.pat_type
    | _ -> ()
end

module Iterator = TypedtreeIter.MakeIterator(MyIteratorArgument)

模块类型TypedtreeIter.IteratorArgument是指定你的迭代器对每个 AST 构造做什么。你有两点来执行你的工作:当遍历进入一个构造时,当它退出时。对于 pattern ,例如,您有 enter_patternexit_pattern .您无需担心递归遍历本身:这是仿函数 MakeIterator 的工作。 .给 IteratorArgument它连接所有enter_*的模块和 exit_*递归地返回一个带有一堆迭代器的模块。

通常你只对 AST 的某些部分感兴趣而想跳过其他部分。 DefaultIteratorArgument是一个模块,其 enter_*exit_*没做什么。您的 IteratorArgument模块应包括 DefaultIteratorArgument继承这个默认行为,然后只实现一些特殊的部分。

如果您不仅要遍历类型化的 AST,还要修改其中的某些部分,请使用 TypedtreeMap而不是 TypedtreeIter .有一个TypedtreeMap的小例子在 https://bitbucket.org/camlspotter/compiler-libs-hack/src/340072a7c14cbce624b98a57bf8c4c6509c40a31/overload/mod.ml?at=default .

(我不使用 ocamlbuild,所以我无能为力。)

关于compiler-construction - 如何在 OCaml 编译器中遍历类型化抽象语法树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28389568/

相关文章:

functional-programming - 为什么在 OCaml 中出现 "Reference to undefined global ` Moduletest'"?

python - 无法修改 pycparser AST |将 AST 转换为 C 代码

java - 在 Java 中解析 Java 的最佳方式

haskell - 在 Haskell 编译器中遍历类型抽象语法树

c++ - C++中虚函数编译器的作用

.NET 目标框架性能

c - 有没有免费软件可以替代 CCS C 编译器?

ocaml - ocamldebug 的 REPL?

functional-programming - 您建议学习哪种英语教程?

java - org.eclipse.jdt.core.dom.AST 的 API 使用示例