2010-06-30 8 views
7

tal vez sólo estoy fallando en algo muy simple, pero estoy desarrollando un intepreter escrito en OCaml con herramientas estándar como ocamllex y ocamlyacc y tengo esta situación:invocación OCaml compilador que acaba de producir .cmi

  • contiene iparser.mly especificación analizador
  • ilexer.mll contiene especificaciones lexer
  • impossible.ml contiene la máquina virtual que se ejecuta el código y todos los tipos necesitaba

El tipo de instrucción que define varias instrucciones está en impossible.ml y el analizador lo necesita, pero impossible.ml usa el analizador definido en iparser.mly por lo que ambos se necesitan mutuamente para compilarse correctamente.

¿Hay alguna manera de producir solo el archivo .cmi para mi impossible.ml? De esta forma, el analizador sabrá sobre los tipos definidos en impossible.ml y me permitirá compilar impossible.cmo/.cmi y compilar más tarde también impossible.cmo. Entonces puedo vincularlos a todos.

Hasta ahora mi script de compilación es:

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 

pero esto no funciona porque ocamlc -c iparser.ml necesidades al menos impossible.cmi para conocer los tipos.

¿Alguna sugerencia? Gracias de antemano ..

Respuesta

5

Necesita crear un archivo impossible.mli y compilar eso. Eso producirá el imposible.cmi y solo el .cmi.

alternativa:

ocamlc -i impossible.ml 

imprimirá la MLI en la salida estándar. Se podría hacer algo como esto:

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

¿No puedo simplemente construir el .cmi inferido normal? De lo que entendí al usar solo un archivo .ml generará un archivo .mli estándar que publica todo el módulo ... ¿estoy en lo cierto? – Jack

+0

Sí, tienes razón. Simplemente no estoy seguro de si hay una forma de generar solo mli/cmi sin también compilar el archivo cmo. Lo más cercano que puedo encontrar en este momento es ocamlc -i impossible.ml que imprimirá el mli predeterminado a stdout. Podría agregar algo al proceso de compilación para hacerlo, redirigir el resultado a un archivo y luego compilarlo. –

+0

Traté de resolverlo, pero por supuesto, llamar 'ocamlc -i impossible.ml' regresa en __Error: valor sin consolidar Iparser.first__ por el mismo problema expuesto en mi pregunta. En este momento, no creo que haya forma de escribir mi propio archivo .mli – Jack

2

en mi humilde opinión, no se puede legítimamente compilar módulos de forma recursiva dependientes de esta manera. Cualquiera factorizar las interdependencias en el tercer módulo (generalmente fácil), o pasarlos como parámetros (o referencias de inicialización mutables - feo), o usar módulos recursivos.