2010-06-30 13 views
7

może jestem po prostu braku w bardzo prostych rzeczy, ale jestem opracowanie intepreter napisany w SML ze standardowych narzędzi jak ocamllex i ocamlyacc i mam taką sytuację:Invoke OCaml kompilator po prostu produkować .cmi

  • iparser.mly zawiera parser Spec
  • ilexer.mll zawiera lexer specyfikację
  • impossible.ml zawiera maszynę wirtualną, która wykonuje kod i wszystkie typy potrzebne

Typ instrukcji, który definiuje różne instrukcje, to impossible.ml i jest wymagany przez analizator składni, ale impossible.ml używa parsera zdefiniowanego w iparser.mly, więc oba wymagają wzajemnej kompilacji.

Czy istnieje sposób, aby wyprodukować tylko plik .cmi dla mojego impossible.ml? W ten sposób parser będzie wiedział o typach zdefiniowanych w impossible.ml i pozwoli mi skompilować impossible.cmo/.cmi, a później skompilować także impossible.cmo. Potem mogę połączyć wszystkie razem.

tej pory mój skrypt kompilacji jest:

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 

ale to nie działa, ponieważ ocamlc -c iparser.ml potrzebuje przynajmniej impossible.cmi znać typy.

Wszelkie sugestie? Z góry dzięki ..

Odpowiedz

5

Musisz utworzyć impossible.mli i skompilować. To spowoduje, że impossible.cmi i tylko .cmi.

Alternatywnie:

ocamlc -i impossible.ml 

wydrukuje MLI na standardowe wyjście. Można zrobić coś takiego:

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

Nie mogę po prostu zbudować normalnego wywnioskowanego .cmi? Z tego co zrozumiałem za pomocą tylko pliku .ml wygeneruje standardowy plik .mli, który publikuje wszystko modułu .. mam rację? – Jack

+0

Tak, masz rację. Po prostu nie jestem pewien, czy istnieje sposób na wyjście tylko mli/cmi bez kompilowania pliku cmo. Najbliżej mogę znaleźć w tej chwili jest ocamlc -i impossible.ml, który wypisze domyślne mli na standardowe wyjście. Możesz dodać coś do procesu kompilacji, aby to zrobić, przekierować wyjście do pliku, a następnie skompilować. –

+0

Próbowałem to rozgryźć, ale wzywanie 'ocamlc -i impossible.ml' zwraca w __Error: wartość niezwiązana Iparser.first__ z powodu tego samego problemu, który został ujawniony w moim pytaniu. W tym momencie myślę, że nie ma sposobu na napisanie własnego pliku .mli. – Jack

2

IMHO, nie można zasadnie skompilować moduły rekurencyjnie-zależnych w ten sposób. Albo pomnóż współzależności w trzecim module (zwykle łatwo), albo przeprowadź je jako parametry (lub zmienne odniesienia inicjalizacji - brzydkie) lub użyj modułów rekursywnych.

Powiązane problemy