1 (****************************************************************************)
5 (* INRIA Rocquencourt *)
7 (* Copyright 2006 Institut National de Recherche en Informatique et *)
8 (* en Automatique. All rights reserved. This file is distributed under *)
9 (* the terms of the GNU Library General Public License, with the special *)
10 (* exception on linking described in LICENSE at the top of the Objective *)
11 (* Caml source tree. *)
13 (****************************************************************************)
16 * - Daniel de Rauglaudre: initial version
17 * - Nicolas Pouillard: refactoring
20 module Make (Structure : Structure.S) = struct
25 value rec flatten_tree =
29 | Node {node = n; brother = b; son = s} ->
30 [ [n :: l] | l <- flatten_tree s ] @ flatten_tree b ];
32 value rec print_symbol ppf =
34 [ Smeta n sl _ -> print_meta ppf n sl
35 | Slist0 s -> fprintf ppf "LIST0 %a" print_symbol1 s
37 fprintf ppf "LIST0 %a SEP %a" print_symbol1 s print_symbol1 t
38 | Slist1 s -> fprintf ppf "LIST1 %a" print_symbol1 s
40 fprintf ppf "LIST1 %a SEP %a" print_symbol1 s print_symbol1 t
41 | Sopt s -> fprintf ppf "OPT %a" print_symbol1 s
42 | Snterml e l -> fprintf ppf "%s@ LEVEL@ %S" e.ename l
43 | Snterm _ | Snext | Sself | Stree _ | Stoken _ | Skeyword _ as s ->
45 and print_meta ppf n sl =
46 loop 0 sl where rec loop i =
51 try String.index_from n i ' ' with [ Not_found -> String.length n ]
54 fprintf ppf "%s %a" (String.sub n i (j - i)) print_symbol1 s;
56 else do { fprintf ppf " "; loop (min (j + 1) (String.length n)) sl }
58 and print_symbol1 ppf =
60 [ Snterm e -> pp_print_string ppf e.ename
61 | Sself -> pp_print_string ppf "SELF"
62 | Snext -> pp_print_string ppf "NEXT"
63 | Stoken (_, descr) -> pp_print_string ppf descr
64 | Skeyword s -> fprintf ppf "%S" s
65 | Stree t -> print_level ppf pp_print_space (flatten_tree t)
66 | Smeta _ _ _ | Snterml _ _ | Slist0 _ | Slist0sep _ _ | Slist1 _ |
67 Slist1sep _ _ | Sopt _ as s ->
68 fprintf ppf "(%a)" print_symbol s ]
69 and print_rule ppf symbols =
71 fprintf ppf "@[<hov 0>";
76 fprintf ppf "%t%a" sep print_symbol symbol;
77 fun ppf -> fprintf ppf ";@ "
83 and print_level ppf pp_print_space rules =
85 fprintf ppf "@[<hov 0>[ ";
90 fprintf ppf "%t%a" sep print_rule rule;
91 fun ppf -> fprintf ppf "%a| " pp_print_space ()
99 value levels ppf elev =
104 [ [Sself :: t] | t <- flatten_tree lev.lsuffix ] @
105 flatten_tree lev.lprefix
108 fprintf ppf "%t@[<hov 2>" sep;
110 [ Some n -> fprintf ppf "%S@;<1 2>" n
113 [ LeftA -> fprintf ppf "LEFTA"
114 | RightA -> fprintf ppf "RIGHTA"
115 | NonA -> fprintf ppf "NONA" ];
116 fprintf ppf "@]@;<1 2>";
117 print_level ppf pp_force_newline rules;
118 fun ppf -> fprintf ppf "@,| "
126 fprintf ppf "@[<v 0>%s: [ " e.ename;
128 [ Dlevels elev -> levels ppf elev
129 | Dparser _ -> fprintf ppf "<parser>" ];
135 module MakeDump (Structure : Structure.S) = struct
140 type brothers = [ Bro of symbol and list brothers ];
142 value rec print_tree ppf tree =
143 let rec get_brothers acc =
145 [ DeadEnd -> List.rev acc
146 | LocAct _ _ -> List.rev acc
147 | Node {node = n; brother = b; son = s} -> get_brothers [Bro n (get_brothers [] s) :: acc] b ]
148 and print_brothers ppf brothers =
149 if brothers = [] then fprintf ppf "@ []"
151 List.iter (fun [ Bro n xs -> do {
152 fprintf ppf "@ @[<hv2>- %a" print_symbol n;
155 | [_] -> try print_children ppf (get_children [] xs)
156 with [ Exit -> fprintf ppf ":%a" print_brothers xs ]
157 | _ -> fprintf ppf ":%a" print_brothers xs ];
160 and print_children ppf = List.iter (fprintf ppf ";@ %a" print_symbol)
161 and get_children acc =
164 | [Bro n x] -> get_children [n::acc] x
166 in print_brothers ppf (get_brothers [] tree)
167 and print_symbol ppf =
169 [ Smeta n sl _ -> print_meta ppf n sl
170 | Slist0 s -> fprintf ppf "LIST0 %a" print_symbol1 s
172 fprintf ppf "LIST0 %a SEP %a" print_symbol1 s print_symbol1 t
173 | Slist1 s -> fprintf ppf "LIST1 %a" print_symbol1 s
175 fprintf ppf "LIST1 %a SEP %a" print_symbol1 s print_symbol1 t
176 | Sopt s -> fprintf ppf "OPT %a" print_symbol1 s
177 | Snterml e l -> fprintf ppf "%s@ LEVEL@ %S" e.ename l
178 | Snterm _ | Snext | Sself | Stree _ | Stoken _ | Skeyword _ as s ->
179 print_symbol1 ppf s ]
180 and print_meta ppf n sl =
181 loop 0 sl where rec loop i =
186 try String.index_from n i ' ' with [ Not_found -> String.length n ]
189 fprintf ppf "%s %a" (String.sub n i (j - i)) print_symbol1 s;
191 else do { fprintf ppf " "; loop (min (j + 1) (String.length n)) sl }
193 and print_symbol1 ppf =
195 [ Snterm e -> pp_print_string ppf e.ename
196 | Sself -> pp_print_string ppf "SELF"
197 | Snext -> pp_print_string ppf "NEXT"
198 | Stoken (_, descr) -> pp_print_string ppf descr
199 | Skeyword s -> fprintf ppf "%S" s
200 | Stree t -> print_tree ppf t
201 | Smeta _ _ _ | Snterml _ _ | Slist0 _ | Slist0sep _ _ | Slist1 _ |
202 Slist1sep _ _ | Sopt _ as s ->
203 fprintf ppf "(%a)" print_symbol s ]
204 and print_rule ppf symbols =
206 fprintf ppf "@[<hov 0>";
211 fprintf ppf "%t%a" sep print_symbol symbol;
212 fun ppf -> fprintf ppf ";@ "
214 (fun _ -> ()) symbols
218 and print_level ppf pp_print_space rules =
220 fprintf ppf "@[<hov 0>[ ";
225 fprintf ppf "%t%a" sep print_rule rule;
226 fun ppf -> fprintf ppf "%a| " pp_print_space ()
234 value levels ppf elev =
239 fprintf ppf "%t@[<v2>" sep;
241 [ Some n -> fprintf ppf "%S@;<1 2>" n
244 [ LeftA -> fprintf ppf "LEFTA"
245 | RightA -> fprintf ppf "RIGHTA"
246 | NonA -> fprintf ppf "NONA" ];
247 fprintf ppf "@]@;<1 2>";
248 fprintf ppf "@[<v2>suffix:@ ";
249 print_tree ppf lev.lsuffix;
250 fprintf ppf "@]@ @[<v2>prefix:@ ";
251 print_tree ppf lev.lprefix;
253 fun ppf -> fprintf ppf "@,| "
261 fprintf ppf "@[<v 0>%s: [ " e.ename;
263 [ Dlevels elev -> levels ppf elev
264 | Dparser _ -> fprintf ppf "<parser>" ];