type node = Node of string * node list
type graph = node list

(* 名前nameのノードか? *)
let is_node name n = let Node(id, _) = n in id = name

(* グラフgから名前nameのノードを探す。なければ追加する *)
let get_node g name =
  try (List.find (is_node name) g, g)
  with Not_found -> let n = Node(name, []) in (n, n::g)

(* グラフgの名前idのノードをnに更新する *)
let update_graph g id n =
  List.fold_left (fun g' x -> if is_node id x then n::g' else x::g') [] g

(* n1のサクセッサにn2を追加する *)
let add_succ n1 n2 g =
  let Node(id1, succ_list) = n1 in
  let Node(id2, _) = n2 in
  try let _ = List.find (is_node id2) succ_list in g
  with Not_found -> update_graph g id1 (Node(id1, n2::succ_list))

(* 代入文 e1 = e2を処理し依存グラフを更新する *)
let process_assign stmt g =
  let (left, right) = stmt in
  let (n1, g') = get_node g left in
  let (n2, g'') = get_node g' right in
  add_succ n1 n2 g''