Search code examples
ocamlocamllexmenhir

OCaml compilation with corebuild


I currently have a project (Go to Python compiler) with the following files

ast.ml
parser.mly
lex.mll
weeder.ml
prettyPrint.ml
main.ml

Here are the dependencies:

parser: ast
lexer: parser, Core, Lexing
weeder: ast
prettyPrint: ast
main: ast, lex, parser, weeder, prettyPrint

I try to compile doing the following which should work according to the documentation I read:

$ menhir parser.mly
> Warning: you are using the standard library and/or the %inline keyword. We
  recommend switching on --infer in order to avoid obscure type error messages.

$ ocamllex lex.mll
> 209 states, 11422 transitions, table size 46942 bytes

$ ocamlbuild -no-hygiene main.native
> File "parser.mli", line 77, characters 56-59:
  Error: Unbound type constructor ast
  Command exited with code 2.
  Compilation unsuccessful after building 6 targets (2 cached) in 00:00:00.

ast.ml contains a list of type declarations in which I have a

type ast = ...

I spent a few hours now reading doc for ocamlfind, corebuild and ocamlopt and nothing. At some point it compiled by what seemed like a mere coincidence and never worked again. I'm open to using any tool.

Here is what is in parser.mly

%{
  open Ast

  exception ParserError of string

  let rec deOptionTypeInList tupleList =
    match tupleList with
      | [] -> []
      | (a, Some t)::tl -> (a, t)::(deOptionTypeInList tl)
      | _ -> raise (ParserError "no type given in type declaration")
%}

[ ... long list of tokens ... ]

%type <ast> prog (* that seems to be the problem *)
%type <string> packDec
%type <dec> dec
%type <dec> subDec
[...]

%start prog

[ ... rules ... ] 

And here is the line, the very last, that is refereed to in the error message.

val prog: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (ast)

Solution

  • The open Ast construct will not be exported to the .mli file where the type of symbols are mentioned. Try using

    %type <Ast.ast>
    

    Edit: also, your build commands are weird. You should not call ocamllex and menhir manually, and consequently not need -no-hygiene. Remove all generated files and just do

    ocamlbuild -use-menhir main.byte