type t = {
root : node;
size : int;
+ by_preorder : node array;
(* TODO add other intersting stuff *)
}
Expat.final psr;
let root = List.hd ctx.stack in
root.next_sibling <- nil;
+ let a = Array.create ctx.current_preorder nil in
+ let rec loop n =
+ if n != nil then
+ begin
+ a.(n.preorder) <- n;
+ loop n.first_child;
+ loop n.next_sibling;
+ end
+ in
+ loop root;
{ root = root;
- size = ctx.current_preorder
+ size = ctx.current_preorder;
+ by_preorder = a
}
)
let data _ n = n.data
let kind _ n = n.kind
let preorder _ n = n.preorder
-
+let by_preorder t i =
+ if i >= 0 && i < t.size then Array.unsafe_get t.by_preorder i
+ else let e = Invalid_argument "by_preorder" in raise e
let print_node fmt n = Parser.debug_node fmt n
(** [preorder t n] returns the pre-order position of [n] in [t].
[preodrder t (root t) == 0] and [preorder t nil < 0].
*)
+
+ val by_preorder : t -> int -> node
+ (** [by_preorder t i] returns the node with preorder [i]
+ *)
val print_node : Format.formatter -> node -> unit
end