我想使用 OCaml 分析 OCaml 文件 (.ml)。我想将文件分解为抽象语法树进行分析。我曾尝试使用camlp4,但没有运气。以前有没有其他人成功地做到过?这是解析 OCaml 文件的最佳方式吗?
2 回答
(我假设您已经了解 OCaml 的基本部分:如何编写 OCaml 代码、如何链接模块和库、如何编写构建脚本等等。如果您不了解,请先学习它们。)
最好的方法是使用 OCaml 编译器本身使用的正版 OCaml 代码解析器,因为它在定义上是 100% 兼容的。
CamlP4 也实现了 OCaml 解析器,但它与真正的解析器略有不兼容,并且解析树在某种程度上专门用于编写语法扩展:对于任何其他类型的分析都不是很好。
您可能希望.ml
使用 P4 解析具有语法扩展名的文件。即使在这种情况下,您也应该坚持使用正版解析器:您可以通过 P4 对源代码进行脱糖,然后使用正版解析器将结果发送到您的分析器。
要使用 OCaml 编译器的解析器,最简单的方法是使用 compiler-libs.common OCamlFind 包。它包含 OCaml 编译器的解析器和类型检查器。
从修改driver/compile.ml
OCaml 编译器源代码开始,它实现了主要的编译阶段:调用预处理器、解析、键入和代码生成。要解析.ml
文件,您应该修改(或简化)Compile.implementation
. 对于.mli
文件Compile.interface
.
祝你好运。
您不能对 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 操作模块的信息。