- external is_young : 'a array -> bool = "caml_custom_is_young" "noalloc"
- external blit : 'a array -> int -> 'a array -> int -> int -> unit = "caml_custom_array_blit"
- module M = Map.Make(struct type t = Grammar.n_symbol let compare = compare end)
- let log = ref M.empty
- let log_symbol s =
- let c = try M.find s !log with _ -> 0 in
- log:= M.add s (c+1) !log
- ;;
- let () = at_exit (fun () -> M.iter (fun i j ->
- if j > 0 then
- Printf.eprintf "%i->%i\n%!"
- (Grammar.symbol i) j) !log )
- ;;
- let blit a1 o1 a2 o2 l = if l != 0 then
- for i = 0 to l - 1 do
- a2.(o2 + i) <- a1.(o1 + i);
- done
-
+let dispatch_param0 conf id2 y0 y1 =
+ match conf with
+ | Grammar2.C0 | Grammar2.C2 -> Grammar2.Node0 id2
+ | Grammar2.C1 | Grammar2.C5 -> Grammar2.Node1(id2,y0)
+ | Grammar2.C3 | Grammar2.C6 -> y0
+ | Grammar2.C4 -> Grammar2.Node2(id2, y0, y1)
+
+let dispatch_param1 conf id2 y0 y1 =
+ match conf with
+ | Grammar2.C2 -> y0
+ | Grammar2.C3 -> Grammar2.Node0 id2
+ | Grammar2.C5 -> y1
+ | Grammar2.C6 -> Grammar2.Node1(id2, y1)
+ | _ -> Grammar2.dummy_param
+
+ module K_down = struct
+ type t = Grammar2.n_symbol * StateSet.t
+ let hash (x,y) = HASHINT2(Node.to_int x, Uid.to_int y.StateSet.Node.id)
+ let equal (x1,y1) (x2,y2) = x1 == x2 && y1 == y2
+ end
+
+ module K_up = struct
+ type t = Grammar2.n_symbol * StateSet.t * StateSet.t * StateSet.t
+ let hash (a,b,c,d) =
+ HASHINT4 (Node.to_int a,
+ Uid.to_int b.StateSet.Node.id,
+ Uid.to_int c.StateSet.Node.id,
+ Uid.to_int d.StateSet.Node.id)
+ let equal (a1, b1, c1, d1) (a2, b2, c2, d2) =
+ a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2
+ end
+
+ module DCache =
+ struct
+ include Hashtbl.Make(K_down)
+ let dummy = StateSet.singleton State.dummy
+ let notfound l = l.(0) == dummy && l.(1) == dummy
+ let find h k =
+ try
+ find h k
+ with
+ Not_found ->
+ let a = [| dummy; dummy |] in
+ add h k a;
+ a
+ end
+ module UCache = Hashtbl.Make(K_up)
+ type result = {
+ in0 : StateSet.t;
+ in1 : StateSet.t;
+ out0 : StateSet.t * U.t;
+ out1 : StateSet.t * U.t;
+ main : StateSet.t * U.t
+ }
+ let mk_empty e =
+ { in0 = StateSet.empty;
+ in1 = StateSet.empty;
+ out0 = e;
+ out1 = e;
+ main = e
+ }
+ let mk_nil s v =
+ {
+ mk_empty (s,v) with
+ out0 = StateSet.empty,v;
+ out1 = StateSet.empty,v;
+ }