2013-11-01 1 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.docstring으로 변환하려면 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 ...