Parsing 使用OCaml解析OCaml文件
我想使用OCaml分析OCaml文件(.ml)。我想把这些文件分解成抽象语法树进行分析。我曾尝试使用camlp4,但没有成功。以前有没有其他人成功地做到这一点?这是解析OCaml文件的最佳方法吗?(我假设您已经知道OCaml的基本部分:如何编写OCaml代码、如何链接模块和库、如何编写构建脚本等等。如果您不知道,请先学习它们。) 最好的方法是使用OCaml编译器本身使用的真正的OCaml代码解析器,因为它在定义上是100%兼容的 CamlP4还实现了OCaml解析器,但它与真正的解析器有点不兼容,并且解析树在某种程度上专门用于编写语法扩展:对于任何其他类型的分析都不是很好 您可能希望使用P4解析具有语法扩展名的Parsing 使用OCaml解析OCaml文件,parsing,ocaml,camlp4,Parsing,Ocaml,Camlp4,我想使用OCaml分析OCaml文件(.ml)。我想把这些文件分解成抽象语法树进行分析。我曾尝试使用camlp4,但没有成功。以前有没有其他人成功地做到这一点?这是解析OCaml文件的最佳方法吗?(我假设您已经知道OCaml的基本部分:如何编写OCaml代码、如何链接模块和库、如何编写构建脚本等等。如果您不知道,请先学习它们。) 最好的方法是使用OCaml编译器本身使用的真正的OCaml代码解析器,因为它在定义上是100%兼容的 CamlP4还实现了OCaml解析器,但它与真正的解析器有点不兼容
.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实现这一点。现在,将这个输出转换成我可以操作的数据类型。