也许我只是失败了一件非常简单的事情,但我正在开发一个用OCaml编写的解释器,使用标准工具 ocamllex 和 ocamlyacc ,我有这种情况:
定义各种指令的指令类型在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
才能知道类型。
有什么建议吗?提前谢谢..
答案 0 :(得分:5)
你需要创建一个不可能的.mli并编译它。这将产生不可能的。只有.cmi。
可替换地:
ocamlc -i impossible.ml
会将mli打印到stdout。你可以这样做:
ocamlc -i impossible.ml > impossible.mli
ocamlc -c impossible.mli
答案 1 :(得分:2)
恕我直言,你不能以这种方式合法地编译递归依赖模块。要么排除第三个模块中的相互依赖性(通常很简单),要么将它们作为参数传递(或者可变的初始化引用 - 丑陋),或者使用递归模块。