2013-11-01 58 views
0

我想打印CIL结构,例如根据CIL API,它具有如下功能:例如, Cil.d_instr,我可以使用它来打印到Errormsg,如Errormsg.log "Instruction: %a\n" d_instr i; 我想将它存储在一个变量中。我试过了:在CIL(OCaml)中打印

let i_str = Printf.sprintf "%a" Pretty.sprint (d_instr i) in ... 

但是,这会导致类型不匹配编译错误。 任何人都可以帮助我吗?谢谢!

回答

4

功能Cil.d_instr的原型如下:

val d_instr : unit -> instr -> Pretty.doc 

因此,为了获得Pretty.doc类型的值,你需要的指令之前申请unit类型的值:d_instr() i

然后,要将Pretty.doc转换为string,则需要使用Pretty.sprint : width:int -> doc -> string。请注意,您需要提供最大宽度(但如果您愿意,您可以使用非常大的宽度)。最后,结合两部分,你会得到:

let i_str = Pretty.sprint max_int (Cil.d_instr() i) 

我建议你仔细阅读Pretty的文档:http://kerneis.github.io/cil/doc/html/cil/api/Pretty.html。它会特别说明,尽可能长时间使用Pretty.doc类型的值,将值与(++)连接起来,并且仅在最后才转换为字符串(或发送到标准输出)会更有效。

最后,但是这在我看来是不必要的复杂,这里是如何组成的,如果你真的想用Printf.sprintf

let ds_instr() i = Pretty.sprint max_int (Cil.d_instr() i) in 
    let i_str = Printf.sprintf "%a" ds_instr i in ...