- let tn = Grammar.non_terminal symbol in
- let nparam = Grammar.num_params tn in
- let a_param = tmp1 (*ArrayPool.create dummy_leaf*) in
- let child = ref (Grammar.first_child g start_symbol idx) in
- for i = 0 to nparam - 1 do
- let c = !child in
- a_param.(i) <- Grammar.Leaf c;
- child := Grammar.next_sibling g start_symbol c;
+ let nt = Grammar2.non_terminal symbol in
+ incr lambda;
+ let lmbd = !lambda in
+ let y0 = (Grammar2.Leaf (lmbd,0, term_array, fc))
+ and y1 = (Grammar2.Leaf (lmbd,1, term_array, ns)) in
+ rule_loop nt states y0 y1
+ end
+ 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);