X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fgrammar2.ml;h=a7ccb09d532f1e9d47d40e10721f589bac3488eb;hb=960e4daabcffa00ab73a9b0edb7366f16df284ba;hp=d2d497ec95d4d32d72e4f501fef2318180a228fd;hpb=f481ede5e31e02fad95d3d0659afb905ed9e03c9;p=SXSI%2Fxpathcomp.git diff --git a/src/grammar2.ml b/src/grammar2.ml index d2d497e..a7ccb09 100644 --- a/src/grammar2.ml +++ b/src/grammar2.ml @@ -205,11 +205,21 @@ struct let tag2, pos2 = pos_id2 params in let id1 = h_find ~msg:"7" tag_to_id tag1 and id2 = h_find ~msg:"8" tag_to_id tag2 in + let conf = + if List.length args = 0 then 0 + else + if List.length args = 1 then + if List.length params = 1 then 1 + else if pos2 = 1 then 2 + else 3 + else (* 2 parameters *) + if List.length params = 1 then 4 + else if pos2 = 1 then 5 + else 6 + in let rule_ = id2 lsl 27 in - let rule_ = (rule_ lor id1) lsl 2 in - let rule_ = (rule_ lor pos2) lsl 2 in - let rule_ = (rule_ lor (List.length params)) lsl 2 in - let rule_ = rule_ lor (List.length args) in + let rule_ = (rule_ lor id1) lsl 3 in + let rule_ = rule_ lor conf in r_array.((h_find ~msg:"9" tag_to_id head) - rules_offset ) <- rule_ ) rules; (*let l = Array.length renum_tags in *) @@ -238,7 +248,7 @@ let parse file = g let _GRAMMAR_MAGIC = 0xaabbcc -let _GRAMMAR_VERSION = 2 +let _GRAMMAR_VERSION = 3 let save g f = let cout = open_out f in @@ -271,14 +281,17 @@ let load f = ignore(Unix.lseek fd pos Unix.SEEK_SET); let bp = Bp.load fd in close_in cin; - { + let g = { start = bp; tags = tags; rules = rules; rules_offset = rules_offset; tag_to_id = tag_to_id; tag_of_id = tag_of_id; - } + } in + Printf.eprintf "Grammar size:%i kb\n%!" + ((Ocaml.size_b g + Bp.alloc_stats ())/1024); + g type node = [ `Start ] Node.t @@ -296,7 +309,9 @@ type tn_symbol = [ any_type ] Node.t type partial = Leaf of node - | Node of tn_symbol * partial array + | Node0 of tn_symbol (* No parameters *) + | Node1 of tn_symbol * partial + | Node2 of tn_symbol * partial * partial let is_nil (t : t_symbol) = @@ -348,20 +363,42 @@ let get_rule g (r : n_symbol) : rhs = Node.of_int (g.rules.((Node.to_int r) - g.rules_offset)) let get_id1 (r : rhs) : tn_symbol = - Node.of_int( - ((Node.to_int r) lsr 6) land 0x7ffffff) + Node.of_int(((Node.to_int r) lsr 3) land 0x7ffffff) let get_id2 (r : rhs) : tn_symbol = - Node.of_int((Node.to_int r) lsr 33) + Node.of_int((Node.to_int r) lsr 30) + +type conf = | C0 (* B(C) *) + | C1 (* B(C(y0)) *) + | C2 (* B(C, y0) *) + | C3 (* B(y0, C) *) + | C4 (* B(C(y0, y1)) *) + | C5 (* B(C(y0), y1) *) + | C6 (* B(y0, C(y1)) *) + +let get_conf (r : rhs) : conf = + (Obj.magic ((Node.to_int r) land 0b111)) + let get_rank (r : rhs) : int = - (Node.to_int r) land 0b11 + match get_conf r with + | C0 -> 0 + | C1 | C2 | C3 -> 1 + | C4 | C5 | C6 -> 2 let get_id1_rank (r : rhs) : int = - ((Node.to_int r) lsr 2) land 0b11 + match get_conf r with + | C0 | C1 | C4 -> 1 + | _ -> 2 let get_id2_pos (r : rhs) : int = - ((Node.to_int r) lsr 4) land 0b11 + match get_conf r with + | C0 | C1 |C2 | C4 | C5 -> 1 + | _ -> 2 let get_id2_rank (r : rhs) : int = - get_rank r + 1 - get_id1_rank r + match get_conf r with + | C0 | C2 | C3 -> 0 + | C1 | C5 | C6 -> 1 + | C4 -> 2 +