5

我想使用 OCaml 分析 OCaml 文件 (.ml)。我想将文件分解为抽象语法树进行分析。我曾尝试使用camlp4,但没有运气。以前有没有其他人成功地做到过?这是解析 OCaml 文件的最佳方式吗?

4

2 回答 2

6

(我假设您已经了解 OCaml 的基本部分:如何编写 OCaml 代码、如何链接模块和库、如何编写构建脚本等等。如果您不了解,请先学习它们。)

最好的方法是使用 OCaml 编译器本身使用的正版 OCaml 代码解析器,因为它在定义上是 100% 兼容的。

CamlP4 也实现了 OCaml 解析器,但它与真正的解析器略有不兼容,并且解析树在某种程度上专门用于编写语法扩展:对于任何其他类型的分析都不是很好。

您可能希望.ml使用 P4 解析具有语法扩展名的文件。即使在这种情况下,您也应该坚持使用正版解析器:您可以通过 P4 对源代码进行脱糖,然后使用正版解析器将结果发送到您的分析器。

要使用 OCaml 编译器的解析器,最简单的方法是使用 compiler-libs.common OCamlFind 包。它包含 OCaml 编译器的解析器和类型检查器。

从修改driver/compile.mlOCaml 编译器源代码开始,它实现了主要的编译阶段:调用预处理器、解析、键入和代码生成。要解析.ml文件,您应该修改(或简化)Compile.implementation. 对于.mli文件Compile.interface.

祝你好运。

于 2014-04-23T02:35:51.870 回答
2

您不能对 ocaml 编译器使用 -dparsetree 选项吗?

你好.ml:

let _ = print_endline "Hello AST"

现在编译它:

$ ocamlc -dparsetree hello.ml

结果是:

[
  structure_item (hello.ml[1,0+0]..[1,0+33])
    Pstr_eval
    expression (hello.ml[1,0+8]..[1,0+33])
      Pexp_apply
      expression (hello.ml[1,0+8]..[1,0+21])
        Pexp_ident "print_endline" (hello.ml[1,0+8]..[1,0+21])
      [
        <label> ""
          expression (hello.ml[1,0+22]..[1,0+33])
            Pexp_constant Const_string("Hello AST",None)
      ]
]

另请参阅有关 -ppx 扩展的这篇博客文章,其中包含有关扩展点语法扩展的一些信息(在 OCaml 4.02 中编写语法扩展的新方法)。有关于各种 AST 操作模块的信息。

于 2014-04-23T16:37:10.223 回答