2010-06-30 9 views
7

Je suis juste à défaut dans une chose très simple, mais je développe un intepreter écrit en OCaml avec des outils standards comme ocamllex et ocamlyacc et j'ai cette situation:compilateur Invoke OCaml juste produire peut-être .cmi

  • iparser.mly contient les spécifications de l'analyseur
  • ilexer.mll contient spec lexer
  • impossible.ml contient la machine virtuelle qui exécute le code et tous les types nécessaires

Le type d'instruction qui définit diverses instructions est impossible.ml et il est nécessaire à l'analyseur, mais impossible.ml utilise l'analyseur défini dans iparser.mly, donc ils ont tous les deux besoin les uns des autres pour compiler correctement.

Existe-t-il un moyen de produire uniquement le fichier .cmi pour mon impossible.ml? De cette façon l'analyseur serait au courant des types définis dans impossible.ml et il me permettra de compiler impossible.cmo/.cmi et de compiler plus tard également impossible.cmo. Ensuite, je peux les relier tous ensemble.

Jusqu'à présent, mon script est la compilation:

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 

mais cela ne fonctionne pas parce que ocamlc -c iparser.ml besoins au moins impossible.cmi de connaître les types.

Des suggestions? Merci d'avance ..

Répondre

5

Vous devez créer un impossible.mli et le compiler. Cela produira l'impossible.cmi et seulement le .cmi.

Autre possibilité:

ocamlc -i impossible.ml 

imprimera les MLI à stdout. Vous pouvez faire quelque chose comme ceci:

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

Je ne peux pas simplement construire le fichier .cmi supposé normal? De ce que j'ai compris en utilisant juste un fichier .ml va générer un fichier .mli standard qui publie tout du module .. ai-je raison? – Jack

+0

Oui, vous avez raison. Je ne suis pas sûr s'il y a un moyen de sortir juste le mli/cmi sans compiler aussi le fichier cmo. Le plus proche que je puisse trouver à l'heure actuelle est ocamlc -i impossible.ml qui imprimera le mli par défaut à stdout. Vous pouvez ajouter quelque chose au processus de construction pour le faire, rediriger la sortie vers un fichier, puis compiler cela. –

+0

J'ai essayé de le comprendre, mais bien sûr l'appel 'ocamlc -i impossible.ml' renvoie dans __Error: La valeur non liée Iparser.first__ en raison du même problème exposé dans ma question. À ce stade, je ne pense pas qu'il y ait moyen d'écrire mon propre fichier .mli – Jack

2

à mon humble avis, vous ne pouvez pas compiler légitimement des modules dépendants récursive-de cette façon. Soit factoriser les interdépendances dans le troisième module (généralement facile), ou les passer en tant que paramètres (ou mutable références d'initialisation - moche), ou utiliser des modules récursifs.