为什么在ocaml的编译器代码中无法获得lexbuf.lex_buffer_len?

时间:2018-09-20 06:53:35

标签: compiler-construction ocaml

我有这个编:

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
 Printf.printf "%d" (buf.lex_buffer_len) ;

工作正常

但是如果我使用    Printf.printf“%d”(buf.lex_buffer_len)

在ocaml 4.07编译源代码/driver/pparse.ml第181行:

let lexbuf = Lexing.from_channel ic in
Printf.printf "%d" (lexbuf.lex_buffer_len) ;

然后我“创造世界”,我得到了错误:

错误(警告40):从类型Lexing.lexbuf中选择了lex_buffer_len。 它在当前范围中不可见,并且不会 如果类型未知,则选择它。

为什么不能在其中使用?在这种情况下如何打印lex_buffer_len?谢谢!

1 个答案:

答案 0 :(得分:2)

如错误文本所示,字段lex_buffer_len属于Lexing模块中定义的类型。因此,引用它的正确方法是事先写lexbuf.Lexing.lex_buffer_lenopen Lexing

OCaml可让您在没有歧义的情况下执行lexbuf.lex_buffer_len(并且lexing.cmi在它搜索签名的目录之一中,但是对于标准库模块,除非您明确指定,否则总是这样)告诉它忽略stdlib),但是,由于这样做很危险(如果在某个时候定义了一个具有类似名称的字段的类型,将会发生奇怪的错误),这会受到警告,并且似乎给与的选项在编译器引导期间,OCaml使警告40错误(请参阅OCaml manual中的选项-w-warn-error