- and counter = ref 0
- and rule_loop (t : Grammar.n_symbol) a_param states =
-
- incr counter;
- if !counter land 8191 == 0 then Gc.minor();
-
- let id1 = Grammar.get_id1 g t in
- let id2 = Grammar.get_id2 g t in
- let param_pos = Grammar.get_param_pos g t in
- let nparam1 = Grammar.num_children id1 in
- let nparam2 =
- if Grammar.is_terminal id2 && Grammar.is_nil g (Grammar.terminal id2) then 0
- else Grammar.num_children id2
- in
- let a_param1 = (*ArrayPool.create dummy_leaf*) tmp2 (* Array.create nparam1 dummy_leaf *) in
- let a_param2 = Array.create nparam2 dummy_leaf (* Array.create nparam2 dummy_leaf *) in
- let i = param_pos - 2 in
- (*Array.blit a_param 0 a_param1 0 (i+1); (* Pass parameters before id2 *) *)
- (* Array.blit is too slow *)
- for k = 0 to i do
- a_param1.(k) <- a_param.(k);
- done;
- a_param1.(i+1) <- Grammar.Node(id2, a_param2); (* id2( ... ) *)
- (*Array.blit a_param (i + nparam2 + 1) a_param1 (i+2) (nparam1 - i - 2); (* Pass parameters after id2 *) *)
- for k = 0 to nparam1 - i -3 do
- a_param1.(i+2+k) <- a_param.(i + nparam2 + 1 + k);
- done;
- (*Array.blit a_param (i + 1) a_param2 0 nparam2; (* parameters below id2 *) *)
- for k = 0 to nparam2 - 1 do
- a_param2.(k) <- a_param.(i+1+k)
- done;
- for i = 0 to nparam1 do
- a_param.(i) <- a_param1.(i)
- done;
- if Grammar.is_non_terminal id1 then
- let id1 = Grammar.non_terminal id1 in
- rule_loop id1 a_param states
- else
- let id1 = Grammar.terminal id1 in
- terminal_loop id1 a_param states
+ and rule_loop (t : Grammar2.n_symbol) states y0 y1 =
+ if t = Node.nil || states == dummy_set then nil_res else
+ let () = incr rule_counter in
+ if !rule_counter land 65535 == 0 then begin Gc.minor() end;
+ let k = (t, states) in
+ let pstates = DCache.find dcache k in
+ let notfound = DCache.notfound pstates in
+ let rhs = Grammar2.get_rule g t in
+ let id1 = Grammar2.get_id1 rhs in
+ let id2 = Grammar2.get_id2 rhs in
+ let conf = Grammar2.get_conf rhs in
+ if notfound then
+ let ny0 = dispatch_param0 conf id2 y0 y1 in
+ let ny1 = dispatch_param1 conf id2 y0 y1 in
+ let res = dispatch_loop id1 states ny0 ny1 in
+ pstates.(0) <- res.in0;
+ pstates.(1) <- res.in1;
+ res (*
+ UCache.add ucache (t, states, fst res.out0, fst res.out1)
+ res.main;
+ let h = Hashtbl.create 7 in
+ for i = 0 to res_len - 1 do
+ Hashtbl.add h (0, i) (snd res.out0).(i);
+ Hashtbl.add h (1, i) (snd res.out1).(i);
+ done;
+ { res with
+ main = ((fst res.main), (U.close h (snd res.main)));
+ } *)