使用OCaml解析OCaml文件

6

我希望能够使用OCaml分析(.ml)文件。 我想将这些文件分解成抽象语法树进行分析。 我尝试使用camlp4但没有成功。 有其他人成功做过吗? 这是解析OCaml文件的最佳方法吗?

2个回答

7
我假设您已经掌握了OCaml的基本部分,比如如何编写OCaml代码、如何链接模块和库、如何编写构建脚本等。如果您还没有掌握这些,请先学习它们。
最好的方法是使用OCaml编译器本身使用的真正的OCaml代码解析器,因为根据定义它是100%兼容的。
CamlP4也实现了OCaml解析器,但它与真正的解析器略有不同,并且解析树在某种程度上专门用于编写语法扩展:对于任何其他类型的分析都不是很好。
您可能希望使用P4使用语法扩展来解析.ml文件。即使在这种情况下,您也应该坚持使用真正的解析器:您可以通过P4对源代码进行去糖,然后使用真正的解析器将结果发送到您的分析器中。
要使用OCaml编译器的解析器,最简单的方法是使用compiler-libs.common OCamlFind包。它包含OCaml编译器的解析器和类型检查器。
从修改OCaml编译器源码的driver/compile.ml开始,它实现了主要的编译阶段:调用预处理器、解析、类型检查,然后生成代码。要解析.ml文件,您应该修改(或简化)Compile.implementation。对于.mli文件,使用Compile.interface。
祝您好运。

谢谢你的建议。这对我很有帮助。希望我能够理解有限的文档中的compile.ml文件。 - cmanning

2

你不能使用ocaml编译器的-dparsetree选项吗?

hello.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)
      ]
]

另请参阅此博客文章,其中提供了有关扩展点语法扩展(OCaml 4.02中编写语法扩展的新方法)的一些信息。在那里可以找到有关各种AST操作模块的信息。


1
这大概是我想要的。知道我可以通过cli做到这一点很好。现在,只需将此输出转换为我可以操作的数据类型即可。 - cmanning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接