2010-06-30 7 views
7

vielleicht bin ich nur in einer wirklich einfachen Sache versagt, aber ich bin ein Interpreter geschrieben in OCaml mit Standardwerkzeugen wie ocamllex und ocamlyacc entwickeln, und ich habe diese Situation:Invoke OCaml Compiler nur zu produzieren .cmi

  • iparser.mly enthält parser spec
  • ilexer.mll LEXER spec enthält
  • impossible.ml die vm enthält, der den Code ausführt, und alle Typen benötigt

Der Befehlstyp, der verschiedene Anweisungen definiert, befindet sich in impossible.ml und wird vom Parser benötigt, aber impossible.ml verwendet den Parser, der in iparser.mly definiert ist, sodass beide sich gegenseitig korrekt kompilieren müssen.

Gibt es eine Möglichkeit, nur die .cmi Datei für meine impossible.ml zu produzieren? Auf diese Weise würde der Parser über die in impossible.ml definierten Typen Bescheid wissen und es mir erlauben, impossible.cmo/.cmi zu kompilieren und später auch impossible.cmo zu kompilieren. Dann kann ich alle zusammen verbinden.

Bisher mein Compilierung Skript ist:

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 

aber das funktioniert nicht, weil ocamlc -c iparser.ml benötigt mindestens impossible.cmi die Typen kennen.

Irgendwelche Vorschläge? Vielen Dank im Voraus ..

Antwort

5

Sie müssen eine impossible.mli erstellen und kompilieren. Das wird die unmögliche.cmi produzieren und nur die .cmi.

Alternativ:

ocamlc -i impossible.ml 

werden die MLI nach stdout drucken. Man könnte so etwas tun:

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

Kann ich nicht einfach die normale abgeleitete .cmi erstellen? Von dem, was ich mit nur einer .ml-Datei verstanden habe, wird eine Standard-.mli-Datei erzeugt, die alles vom Modul veröffentlicht. Habe ich recht? – Jack

+0

Ja, Sie haben Recht. Ich bin nur nicht sicher, ob es eine Möglichkeit gibt, nur die mli/cmi auszugeben, ohne auch die cmo-Datei zu kompilieren. Die nächste, die ich im Moment finden kann, ist ocamlc -i unmögliche.ml, die den Standard-mli auf stdout druckt. Sie könnten etwas zum Build-Prozess hinzufügen, um dies zu tun, die Ausgabe in eine Datei umleiten und diese dann kompilieren. –

+0

Ich versuchte es herauszufinden, aber natürlich ruft 'ocamlc -i imploit.ml' zurück in __Error: Unbound Wert Iparser.first__ wegen des gleichen Problems in meiner Frage ausgesetzt. An diesem Punkt glaube ich nicht, dass es um meine eigene .mli Datei – Jack

2

IMHO, können Sie nicht darauf vertrauen rekursiv abhängige Module auf diese Weise zusammenzustellen. Entweder die Interdependenzen im dritten Modul (normalerweise einfach) ausklammern oder sie als Parameter übergeben (oder veränderbare Initialisierungsreferenzen - hässlich) oder rekursive Module verwenden.