用CIL(OCaml)打印

用CIL(OCaml)打印,ocaml,berkeley-cil,Ocaml,Berkeley Cil,我想打印CIL结构,例如CIL.instr 根据CIL API,它有一个函数,如CIL.d_instr,我可以使用它打印到Errormsg,如Errormsg.log”指令:%a\n“d_instr I 我想把它的值存储在一个变量中。我试过: let i_str = Printf.sprintf "%a" Pretty.sprint (d_instr i) in ... 但是,这会导致类型不匹配编译错误。 有人能帮我吗?谢谢 Cil.d_instr功能具有以下原型: val d_instr

我想打印CIL结构,例如
CIL.instr
根据CIL API,它有一个函数,如
CIL.d_instr
,我可以使用它打印到Errormsg,如
Errormsg.log”指令:%a\n“d_instr I
我想把它的值存储在一个变量中。我试过:

  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
的文档:。它将特别向您解释,尽可能长时间地使用
Pretty.doc
类型的值,将值与
(++)
串联,并仅在最后转换为字符串(或发送到标准输出)更有效

最后,但在我看来这是不必要的复杂,如果您真的想使用
Printf.sprintf
,下面是如何编写它:

让ds_instr()i=Pretty.sprint max_int(Cil.d_instr()i)进入
让i_str=Printf.sprintf“%a”插入。。。

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
的文档:。它将特别向您解释,尽可能长时间地使用
Pretty.doc
类型的值,将值与
(++)
串联,并仅在最后转换为字符串(或发送到标准输出)更有效

最后,但在我看来这是不必要的复杂,如果您真的想使用
Printf.sprintf
,下面是如何编写它:

让ds_instr()i=Pretty.sprint max_int(Cil.d_instr()i)进入
让i_str=Printf.sprintf“%a”插入。。。