我想用OCaml分析OCaml文件(.ml)。我想把这些文件分解成抽象语法树进行分析。我尝试过使用camlp4,但没有成功。以前有没有其他人成功地做到了这一点?这是解析OCaml文件的最佳方法吗?
发布于 2014-04-23 10:35:52
(我假设您已经了解了OCaml的基本部分:如何编写OCaml代码、如何链接模块和库、如何编写构建脚本等等。如果您不了解,请先学习它们。)
最好的方法是使用OCaml编译器本身使用的真正的OCaml代码解析器,因为它在定义上是100%兼容的。
CamlP4还实现了OCaml解析器,但它与真正的解析器略有不兼容,并且解析树在某种程度上专门用于编写语法扩展:对于任何其他类型的分析都不是很好。
您可能希望使用P4解析具有语法扩展名的.ml文件。即使在这种情况下,您也应该坚持使用真正的解析器:您可以使用P4对源代码进行去粘处理,然后使用真正的解析器将结果发送到您的分析器。
要使用编译器的解析器,最简单的方法是使用OCaml -libs.common OCamlFind包。它包含OCaml编译器的解析器和类型检查器。
从修改OCaml编译器源代码的driver/compile.ml开始,实现了主要的编译阶段:调用预处理器、解析、键入、代码生成。要解析.ml文件,您应该修改(或简化) Compile.implementation。对于.mli文件,请使用Compile.interface。
祝好运。
发布于 2014-04-24 00:37:10
不能对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)
]
]另请参阅this blog post on -ppx extensions,其中包含有关扩展点语法扩展( OCaml 4.02中编写语法扩展的新方法)的一些信息。那里有关于各种AST操作模块的信息。
https://stackoverflow.com/questions/23233636
复制相似问题