-(* log_symbol (t); *)
- if !rule_counter land (4095) == 0 then begin Gc.minor() end;
- let id1 = Grammar.get_id1 g t in
- let id2 = Grammar.get_id2 g t in
- let param_pos = Grammar.get_param_pos t in
- let nparam1 = Grammar.num_children id1 in
- let nparam2 =
- if Grammar.is_terminal id2 && nil_symbol == (Grammar.terminal id2) then 0
- else Grammar.num_children id2
- in
- let a_param2 = if nparam2 == 0 then [||] else Array.create nparam2 dummy_leaf in
- let i = param_pos - 2 in
- let ip1 = i + 1 in
- let offset2d = i+2 in
- let offset2s = i+nparam2 + 1 in
- blit a_param 0 parameters_tmp 0 (i+1);
- parameters_tmp.(ip1) <- Grammar.Node(id2, a_param2); (* id2( ... ) *)
- blit a_param offset2s parameters_tmp offset2d (nparam1 - i - 2);
- blit a_param ip1 a_param2 0 nparam2;
-
- blit parameters_tmp 0 parameters 0 nparam1;
- if Grammar.is_non_terminal id1 then
- let id1 = Grammar.non_terminal id1 in
- rule_loop id1 states parameters
+ 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))