我想根据CIL打印CIL结构(例如Cil.instr ),它有一个类似于Cil.d_instr的函数,我可以用它来打印到错误信息中,比如Errormsg.log "Instruction: %a\n" d_instr i;,我想把它的值存储在一个变量中。我试过:
let i_str = Printf.sprintf "%a" Pretty.sprint (d_instr i) in ...但是,这会导致类型错配编译错误。有人能帮我吗?谢谢!
发布于 2013-11-01 11:12:57
函数Cil.d_instr具有以下原型:
val d_instr : unit -> instr -> Pretty.doc因此,要获得Pretty.doc类型的值,需要在指令:d_instr () i之前应用unit类型的值。
然后,要将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 ...https://stackoverflow.com/questions/19719706
复制相似问题