- 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
+ and rule_loop (t : Grammar2.n_symbol) states rank y0 y1 =
+ incr rule_counter;
+ if !rule_counter land (65535) == 0 then begin Gc.minor() end;
+ 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 Grammar2.is_non_terminal g id1 then
+ let id1 = Grammar2.non_terminal id1 in
+ match conf with
+ | Grammar2.C0 -> rule_loop id1 states 1 (Grammar2.Node0 id2) dummy_leaf
+ | Grammar2.C1 -> rule_loop id1 states 1 (Grammar2.Node1(id2,y0)) dummy_leaf
+ | Grammar2.C2 -> rule_loop id1 states 2 (Grammar2.Node0 id2) y0
+ | Grammar2.C3 -> rule_loop id1 states 2 y0 (Grammar2.Node0 id2)
+ | Grammar2.C4 -> rule_loop id1 states 1 (Grammar2.Node2(id2, y0, y1)) dummy_leaf
+ | Grammar2.C5 -> rule_loop id1 states 2 (Grammar2.Node1(id2, y0)) y1
+ | Grammar2.C6 -> rule_loop id1 states 2 y0 (Grammar2.Node1(id2, y1))