let print_nfa (nfa : nfa) : unit =
  let print_trans s1 s2 cset = 
    Printf.printf "q%d -> q%d on " s1 s2;
    Charset.print_charset cset;
    Printf.printf "\n" in
  let print_delta s1 m = 
    Hashtbl.iter (fun s2 cset -> print_trans s1 s2 cset) m in
  let print_eps_trans s1 s2 =
    Printf.printf "q%d -> q%d on epsilon\n" s1 s2 in
  let print_epsilon s1 m = iter (fun s2 -> print_eps_trans s1 s2) m in
    Printf.printf "[ s: q%d f: q%d d: " nfa.s nfa.f;
    Hashtbl.iter print_delta nfa.delta;
    Hashtbl.iter print_epsilon nfa.epsilon;
    Printf.printf "];\n"