【问题标题】:Parsing an OCaml file with OCaml使用 OCaml 解析 OCaml 文件
【发布时间】:2014-06-07 15:45:51
【问题描述】:

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

【问题讨论】:

    标签: parsing ocaml camlp4


    【解决方案1】:

    (我假设您已经了解 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 及其限制性文档。
    【解决方案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)
          ]
    ]
    

    另请参阅this blog post on -ppx extensions,其中包含有关扩展点语法扩展的一些信息(OCaml 4.02 中编写语法扩展的新方法)。有关于各种 AST 操作模块的信息。

    【讨论】:

    • 这有点像我想找的东西。很高兴知道我可以通过 cli 做到这一点。现在,只需将此输出转换为我可以操作的数据类型。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2013-04-29
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多