Guest User

Untitled

a guest
Jun 2nd, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.61 KB | None | 0 0
  1. let rec kill (b : (blabel * block) set) : (blabel * ide) set = match b with
  2.     [] -> []
  3.     | (l, BSkip)::b -> union (kill b) [l, " "]
  4.     | (l, BAssignVar(n, _))::b -> union (kill b) [l, n]
  5.     | (l, BAssignArray(n, _, _))::b -> union (kill b) [l, n]
  6.     | (l, _)::b -> union (kill b) [l, " "];;
  7.  
  8. let rec var_list e = match e with
  9.     N _ -> []
  10.     | Val n -> [n]
  11.     | ArrayVal(n, _) -> [n]
  12.     | Add(e1, e2) -> var_list e1 @ var_list e2
  13.     | Sub(e1, e2) -> var_list e1 @ var_list e2
  14.     | Mul(e1, e2) -> var_list e1 @ var_list e2
  15.     | Eq(e1, e2) -> var_list e1 @ var_list e2
  16.     | Lt(e1, e2) -> var_list e1 @ var_list e2
  17.     | Not(e') -> var_list e'
  18.     | And(e1, e2) -> var_list e1 @ var_list e2
  19.     | Or(e1, e2) -> var_list e1 @ var_list e2;;
  20.  
  21. let rec gen (b : (blabel * block) set) : (blabel * (ide set)) set = match b with
  22.     [] -> []
  23.     | (l, BSkip)::b -> union (gen b) [l, []]
  24.     | (l, BAssignVar(_, e))::b -> union (gen b) [l, var_list e]
  25.     | (l, BAssignArray(_, _, e))::b -> union (gen b) [l, var_list e]
  26.     | (l, BGuard e)::b -> union (gen b) [l, var_list e];;
  27.  
  28. let rec flow_rev_get_l (l : blabel) (f : (blabel * blabel) set) : blabel =
  29.     match f with
  30.         [] -> ""
  31.         | (l'', l')::f ->
  32.             if l = l' then l'' else flow_rev_get_l l f;;
  33.            
  34. let rec get_block (l : blabel) (b : (blabel * block) set) : block = match b with
  35.     [] -> raise NotFound
  36.     | (l', b')::b -> if l = l' then b' else get_block l b;;
  37.  
  38. let rec search_and_destroy n l = match l with
  39.     [] -> []
  40.     | e::l -> if n = e then search_and_destroy n l else [e] @ search_and_destroy n l;;
  41.  
  42. let rec get_vars (l : blabel) (k : (blabel * 'a) set) : ide set = match k with
  43.     [] -> []
  44.     | (l', n)::k -> if l = l' then n else get_vars l k;;
  45.  
  46. let rec exit (l : blabel) (s : s) : ide set =
  47.     if member l (final s)
  48.     then []
  49.     else
  50.         let l' = flow_rev_get_l l (flow_rev s) in
  51.         entry l' s
  52. and entry (l : blabel) (s : s) : ide set =
  53.     let bl = (l, get_block l (blocks s)) in
  54.     let sub = search_and_destroy (List.hd (get_vars l (kill [bl]))) [l, (exit l)] in
  55.     sub @ gen [bl];;
  56.  
  57. let test =
  58.     ImpProg(Dseq(Var "x", Dseq(Var "y", Var "z")),
  59.     Cseq(AssignVar("x", N 2), Cseq(AssignVar("y", N 4),
  60.     Cseq(AssignVar("x", N 1), Cseq(If(Lt(Val "x", Val "y"), AssignVar("z", Val "y"),
  61.     AssignVar("z", Mul(Val "y", Val "y"))), AssignVar("x", Val "z"))))));;
  62.  
  63. let test' = labeledprog test;;
  64.  
  65. (* Write a function lv: cfg -> (blabel -> ide set), which computes the live variables analysis on the given control flow graph.
  66. Hint. The analysis for array assignments can be arbitrarily imprecise, e.g. you can consider live an array if any of its elements is used. *)
  67. let lv (cfg:cfg) (l: blabel) : ide set = match cfg with
  68.     (l1, l2) -> ;;
Add Comment
Please, Sign In to add comment