我想打印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 ...
但是,这会导致类型不匹配编译错误。 任何人都可以帮助我吗?谢谢!
我想打印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 ...
但是,这会导致类型不匹配编译错误。 任何人都可以帮助我吗?谢谢!
功能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 ...