-let traversal g =
- let start_symbol = (Node.of_int 0) in
- let rec start_loop idx =
- if idx >= Node.null then begin
- let symbol = get_symbol_at g start_symbol idx in
- if is_terminal symbol then
- let ts = terminal symbol in
- if is_nil g ts then () else
- let str = get_tag g ts in
- Printf.printf "<%s>%!" str;
- start_loop (first_child g start_symbol idx);
- start_loop (next_sibling g start_symbol idx);
- Printf.printf "</%s>%!" str;
- else
- let tn = non_terminal symbol in
- let nparam = num_params tn in
- let child = ref (first_child g start_symbol idx) in
- let a_param = Array.init nparam
- (fun _ -> let c = !child in
- child := next_sibling g start_symbol c;
- c)
- in
- rule_loop tn a_param
- end
- and rule_loop (nterm : [ `NonTerminal | `Terminal ] Node.t) a_param =
- let
-
- in
- start_loop (Node.of_int 0)
-;;