我有这个prog parsetreetest.ml:
let ()=
let filename = "test.ml" in
Location.input_name := filename ;
let readhandle = open_in filename in
let buf = Lexing.from_channel readhandle in
Location.init buf filename ;
let ast = Parse.implementation buf in
let pstr_desc=(List.nth ast 0).pstr_desc in
match pstr_desc with
|Pstr_eval (expression,attributes)->
match expression.pexp_desc with
|Pexp_constant constant->
match constant with
|Pconst_integer (const_int,char_option)->
Printf.printf "%s" const_int;
close_in readhandle
如果test.ml仅具有整数,例如:1,则该编可以读取它并返回Parsetree。
在parsetree.mli中:
and expression_desc =
| Pexp_ident of Longident.t loc
(* x
M.x
*)
| Pexp_constant of constant
(* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
如果我编写parsetreetest2.ml,则Pexp_ident与Pexp_constant平行:
let ()=
let filename = "test2.ml" in
Location.input_name := filename ;
let readhandle = open_in filename in
let buf = Lexing.from_channel readhandle in
Location.init buf filename ;
let ast = Parse.implementation buf in
let pstr_desc=(List.nth ast 0).pstr_desc in
match pstr_desc with
|Pstr_eval (expression,attributes)->
match expression.pexp_desc with
|Pexp_ident loc->
match loc with
|Lident l->
Printf.printf "%s" l;
close_in readhandle
在test2.ml中,我写了x,如parsetree.mli示例所示,然后使用ocamlbuild编译器,该编译器成功地编译了parsetreetest.ml,出现了错误:
文件“ parsetreetest2.ml”,第14行,字符7-13: 错误:未绑定的构造函数Lident
我不知道为什么我不能这样做,谢谢!
答案 0 :(得分:0)
您没有显示Lident
的定义,因此显而易见的结论是,构造函数未定义,这正是编译器告诉您的。适用的案例不使用Lident
,因此没有错误。
听起来您正在处理一些预先存在的文件。因此,要做的事情可能是环顾四周,找到Lident
的定义,并确保它已被编译并且可以被编译器找到。
如果要从其他地方复制代码,则可能要查看其他代码中是否有任何open
声明。可能使用open
声明会使Lident
在您的代码中可用。