У меня есть эта прога 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 *)
Pexp_ident идет параллельно Pexp_constant, если я напишу parsetreetest2.ml:
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
Не знаю, почему я не могу этого сделать, спасибо!