0

我想打印 CIL 结构,例如Cil.instr 根据 CIL API,它有一个类似 eg 的函数Cil.d_instr,我可以用它来打印到 Errormsg,例如Errormsg.log "Instruction: %a\n" d_instr i; 我想将它的值存储在一个变量中。我试过了:

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

但是,这会导致类型不匹配编译错误。谁可以帮我这个事?谢谢!

4

1 回答 1

4

该函数Cil.d_instr具有以下原型:

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

因此,要获得 type 的值Pretty.doc,您需要unit在指令之前应用 type 的值:d_instr () i

然后,要将 a 转换Pretty.doc为 a 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 ...
于 2013-11-01T11:12:57.947 回答