Этот код работает нормально:
let ()=
let filename = "/home/wk/prog/LocationTest/b.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
Printf.printf "%d" (List.length ast) ;
тип ast - Parsetree.structure, который представляет собой «список struct_item», поэтому я могу использовать List.length, получить его длину
Я используютот же метод для отладки исходного кода компилятора ocaml 4.07:
Я изменяю исходный код компилятора ocaml 4.07 /driver/pparse.ml 181-183:
let lexbuf = Lexing.from_channel ic in
Location.init lexbuf inputfile;
Profile.record_call "parser" (fun () -> parse_fun lexbuf)
на следующее:
let lexbuf = Lexing.from_channel ic in
Location.init lexbuf inputfile;
let xx=parse_fun lexbuf in
Printf.printf "%d" (List.length xx);
Profile.record_call "parser" (fun () -> xx)
parse_fun - это Parse.implementation, затем "make world", возникла ошибка:
Error: This expression has type 'a list
but an expression was expected of type a
Я не знаю, почему так же не получается в этой ситуации, спасибо!