调用OCaml编译器只生成.cmi

时间:2010-06-30 15:16:49

标签: header ocaml compilation

也许我只是失败了一件非常简单的事情,但我正在开发一个用OCaml编写的解释器,使用标准工具 ocamllex ocamlyacc ,我有这种情况:

  • iparser.mly包含解析器规范
  • ilexer.mll包含lexer规范
  • impossible.ml包含执行代码的vm和所需的所有类型

定义各种指令的指令类型在impossible.ml中,解析器需要它,但impossible.ml使用iparser.mly中定义的解析器,因此它们都需要彼此正确编译。

有没有办法只生成.cmi的{​​{1}}文件?通过这种方式,解析器将了解impossible.ml中定义的类型,并允许我编译impossible.ml,然后再编译impossible.cmo/.cmi。然后我可以把所有这些链接在一起。

到目前为止,我的编译脚本是:

impossible.cmo

但这不起作用,因为ocamlyacc iparser.mly ocamlc -c iparser.mli ocamllex ilexer.mll ocamlc -c ilexer.ml ocamlc -c iparser.ml ocamlc -c impossible.ml ocamlc -o imp.exe ilexer.cmo iparser.cmo impossible.cmo 至少需要ocamlc -c iparser.ml才能知道类型。

有什么建议吗?提前谢谢..

2 个答案:

答案 0 :(得分:5)

你需要创建一个不可能的.mli并编译它。这将产生不可能的。只有.cmi。

可替换地:

ocamlc -i impossible.ml

会将mli打印到stdout。你可以这样做:

ocamlc -i impossible.ml > impossible.mli
ocamlc -c impossible.mli

答案 1 :(得分:2)

恕我直言,你不能以这种方式合法地编译递归依赖模块。要么排除第三个模块中的相互依赖性(通常很简单),要么将它们作为参数传递(或者可变的初始化引用 - 丑陋),或者使用递归模块。