2013-11-01 85 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 ...