我目前有一个带有以下文件的项目(转到Python编译器)
ast.ml
parser.mly
lex.mll
weeder.ml
prettyPrint.ml
main.ml
以下是依赖项:
parser: ast
lexer: parser, Core, Lexing
weeder: ast
prettyPrint: ast
main: ast, lex, parser, weeder, prettyPrint
我尝试编译以下应该按照我读过的文档进行编译:
$ 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包含一个类型声明列表,其中我有一个
type ast = ...
我现在花了几个小时阅读ocamlfind,corebuild和ocamlopt的文档,什么都没有。在某些时候,它编写的似乎只是巧合,从未再次工作。我愿意使用任何工具。
以下是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 ... ]
这是在错误消息中被引用的行,最后一行。
val prog: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (ast)
答案 0 :(得分:4)
open Ast
构造不会导出到提及符号类型的.mli
文件中。尝试使用
%type <Ast.ast>
编辑:另外,你的构建命令很奇怪。您不应手动拨打ocamllex
和menhir
,因此不需要-no-hygiene
。删除所有生成的文件,然后执行
ocamlbuild -use-menhir main.byte