Вызвать компилятор OCaml для создания .cmi - PullRequest
7 голосов
/ 30 июня 2010

может быть, я просто ошибаюсь в очень простой вещи, но я разрабатываю intepreter, написанный на OCaml, со стандартными инструментами, такими как ocamllex и ocamlyacc , и у меня такая ситуация:1005 *

  • iparser.mly содержит спецификацию синтаксического анализатора
  • ilexer.mll содержит спецификацию лексера
  • невозможный.ml содержит виртуальную машину, выполняющую код, и все необходимые типы

Тип инструкции, который определяет различные инструкции, находится в impossible.ml, и он необходим для синтаксического анализатора, но impossible.ml использует синтаксический анализатор, определенный в iparser.mly, поэтому они оба нуждаются друг в друге для корректной компиляции.

Есть ли способ создать файл .cmi для моего 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 требуется по крайней мере impossible.cmi, чтобы знатьтипы.

Есть предложения?Заранее спасибо ..

Ответы [ 2 ]

5 голосов
/ 30 июня 2010

Вам нужно создать невозможный.mli и скомпилировать его.Это приведет к невозможному .cmi и только .cmi.

В качестве альтернативы:

ocamlc -i impossible.ml

выведет mli в стандартный выводВы могли бы сделать что-то вроде этого:

ocamlc -i impossible.ml > impossible.mli
ocamlc -c impossible.mli
2 голосов
/ 30 июня 2010

ИМХО, вы не можете законным образом компилировать рекурсивно-зависимые модули таким способом. Либо выведите взаимозависимости в третьем модуле (обычно это просто), либо передайте их как параметры (или изменяемые ссылки инициализации - безобразно), либо используйте рекурсивные модули.

...