김형모
가입: 2014년 9월 3일 올린 글: 37
|
올려짐: 2015년12월15일 5:32 주제: 8-1의 디버깅을 위한 코드 일부 |
|
|
코드: |
(* for DEBUG *)
let debug = true
exception DO_YOURSELF
(* stack indentation level *)
let cnt = ref 0
let inc () = cnt := !cnt + 1
let dec () = cnt := !cnt - 1
let print_indent () =
let rec pp i =
if i <= 1 then ()
else let _ = print_string " | " in pp (i - 1)
in let _ = pp !cnt in print_string " "
(* push/pop call stack *)
let call str =
if debug then
let _ = inc () in
let _ = print_indent () in
print_string (str ^ "\n")
else ()
let ret str =
if debug then
let _ = print_indent () in
let _ = print_string (str ^ "\n") in
dec ()
else ()
(* print debug message *)
let deb str =
if debug then
let _ = print_indent () in
print_string ("* " ^ str)
else ()
let prt : typ -> unit =
let rec iter : typ -> unit =
fun t ->
match t with
| TInt -> print_string "Int"
| TBool -> print_string "Bool"
| TString -> print_string "String"
| TPair (t1, t2) ->
let _ = print_string "(" in
let _ = iter t1 in
let _ = print_string ", " in
let _ = iter t2 in
print_string ")"
| TFun (t1, t2) ->
let _ = print_string "(" in
let _ = iter t1 in
let _ = print_string " → " in
let _ = iter t2 in
print_string ")"
| TLoc t ->
let _ = iter t in
print_string "_Loc"
| TVar v -> print_string ("Var " ^ v)
| _ -> raise DO_YOURSELF
in
fun t ->
if debug then
let _ = iter t in
print_string "\n"
else ()
(* decide gen-type with sim-type *)
let is_gen : typ_scheme -> bool =
fun tyscm ->
match tyscm with
| GenTyp _ -> true | _ -> false
|
8-1의 디버깅이 print_string으로 찍는 수밖에 없는데, 케이스에 따라 출력이 길어지면 보기 힘들어서 만들었습니다.
raise DO_YOURSELF 부분을 본인의 구현에 따라 고치거나 지워서 사용하시면 될 것 같습니다.
허접하지만 공유해봅니다.
용례 :
let val x = 2 in
let val x = 3 in
x
end
end
[Let Val] x
* t -> Var x_1
| [Int]
| * t -> Var x_2
| * t <- Int
| [Int]
* e1 solved : Int
* expand e1 = false
* x-sim <- Int
| [Let Val] x
| * t -> Var x_1
| | [Int]
| | * t -> Var x_3
| | * t <- Int
| | [Int]
| * e1 solved : Int
| * expand e1 = false
| * x-sim <- Int
| | [Var] x
| | * t -> Var x_1
| | * t-sim <- Int
| | [Var] x
| * e2 solved = t : Int
| [Let Val] x
* e2 solved = t : Int
[Let Val] x
==========[ Equation Solved ]==========
>>> int |
|