Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 使用OCaml解析OCaml文件_Parsing_Ocaml_Camlp4 - Fatal编程技术网

Parsing 使用OCaml解析OCaml文件

Parsing 使用OCaml解析OCaml文件,parsing,ocaml,camlp4,Parsing,Ocaml,Camlp4,我想使用OCaml分析OCaml文件(.ml)。我想把这些文件分解成抽象语法树进行分析。我曾尝试使用camlp4,但没有成功。以前有没有其他人成功地做到这一点?这是解析OCaml文件的最佳方法吗?(我假设您已经知道OCaml的基本部分:如何编写OCaml代码、如何链接模块和库、如何编写构建脚本等等。如果您不知道,请先学习它们。) 最好的方法是使用OCaml编译器本身使用的真正的OCaml代码解析器,因为它在定义上是100%兼容的 CamlP4还实现了OCaml解析器,但它与真正的解析器有点不兼容

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

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

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

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

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

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

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


祝你好运。

你不能在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)
      ]
]
[
结构_项(hello.ml[1,0+0]…[1,0+33])
评估
表达式(hello.ml[1,0+8]…[1,0+33])
Pexp_应用
表达式(hello.ml[1,0+8]…[1,0+21])
Pexp_ident“print_endline”(hello.ml[1,0+8]…[1,0+21])
[
""
表达式(hello.ml[1,0+22]…[1,0+33])
Pexp_常量常量字符串(“Hello AST”,无)
]
]

另请参阅其中关于扩展点语法扩展的一些信息(OCAML4.02中编写语法扩展的新方法)。这里有关于各种AST操作模块的信息。

谢谢您的建议。这很有帮助。希望我能理解compile.ml及其有限的文档。这就是我想寻找的。很高兴知道我可以通过cli实现这一点。现在,将这个输出转换成我可以操作的数据类型。