CCKtree: add a Format printer

This commit is contained in:
Simon Cruanes 2014-12-01 15:44:44 +01:00
parent 23c1288849
commit cebc58ada1
3 changed files with 29 additions and 18 deletions

View file

@ -33,6 +33,7 @@ type 'a sequence = ('a -> unit) -> unit
type 'a gen = unit -> 'a option type 'a gen = unit -> 'a option
type 'a klist = unit -> [`Nil | `Cons of 'a * 'a klist] type 'a klist = unit -> [`Nil | `Cons of 'a * 'a klist]
type 'a printer = Buffer.t -> 'a -> unit type 'a printer = Buffer.t -> 'a -> unit
type 'a formatter = Format.formatter -> 'a -> unit
type +'a t = unit -> [`Nil | `Node of 'a * 'a t list] type +'a t = unit -> [`Nil | `Node of 'a * 'a t list]
@ -132,7 +133,7 @@ module FQ = struct
hd : 'a list; hd : 'a list;
tl : 'a list; tl : 'a list;
} }
exception Empty exception Empty
(* invariant: if hd=[], then tl=[] *) (* invariant: if hd=[], then tl=[] *)
@ -220,24 +221,24 @@ module Dot = struct
| `Id n :: l' -> n, List.rev_append acc l' | `Id n :: l' -> n, List.rev_append acc l'
| x :: l' -> _find_id (x::acc) l' | x :: l' -> _find_id (x::acc) l'
let _pp_attr buf attr = match attr with let _pp_attr fmt attr = match attr with
| `Color c -> Printf.bprintf buf "color=%s" c | `Color c -> Format.fprintf fmt "color=%s" c
| `Shape s -> Printf.bprintf buf "shape=%s" s | `Shape s -> Format.fprintf fmt "shape=%s" s
| `Weight w -> Printf.bprintf buf "weight=%d" w | `Weight w -> Format.fprintf fmt "weight=%d" w
| `Style s -> Printf.bprintf buf "style=%s" s | `Style s -> Format.fprintf fmt "style=%s" s
| `Label l -> Printf.bprintf buf "label=\"%s\"" l | `Label l -> Format.fprintf fmt "label=\"%s\"" l
| `Other (name, value) -> Printf.bprintf buf "%s=\"%s\"" name value | `Other (name, value) -> Format.fprintf fmt "%s=\"%s\"" name value
| `Id _ -> () (* should not be here *) | `Id _ -> () (* should not be here *)
let rec _pp_attrs buf l = match l with let rec _pp_attrs fmt l = match l with
| [] -> () | [] -> ()
| [x] -> _pp_attr buf x | [x] -> _pp_attr fmt x
| x::l' -> | x::l' ->
_pp_attr buf x; _pp_attr fmt x;
Buffer.add_char buf ','; Format.pp_print_char fmt ',';
_pp_attrs buf l' _pp_attrs fmt l'
let pp buf (name,l) = let print fmt (name,l) =
(* nodes already printed *) (* nodes already printed *)
let tbl = Hashtbl.create 32 in let tbl = Hashtbl.create 32 in
(* fresh name generator *) (* fresh name generator *)
@ -267,11 +268,11 @@ module Dot = struct
let name, attrs = get_name x in let name, attrs = get_name x in
begin match parent with begin match parent with
| None -> () | None -> ()
| Some n -> Printf.bprintf buf " %s -> %s;\n" n name | Some n -> Format.fprintf fmt " %s -> %s;@," n name
end; end;
if not (Hashtbl.mem tbl name) then ( if not (Hashtbl.mem tbl name) then (
Hashtbl.add tbl name (); Hashtbl.add tbl name ();
Printf.bprintf buf " %s [%a];\n" name _pp_attrs attrs; Format.fprintf fmt "@[%s [%a];@]@," name _pp_attrs attrs;
List.fold_left List.fold_left
(fun q y -> FQ.push q (Some name, y)) q l (fun q y -> FQ.push q (Some name, y)) q l
) else q ) else q
@ -282,11 +283,16 @@ module Dot = struct
FQ.empty l FQ.empty l
in in
(* preamble *) (* preamble *)
Printf.bprintf buf "digraph %s {\n" name; Format.fprintf fmt "@[<hv 2>digraph %s {@," name;
aux q; aux q;
Printf.bprintf buf "}\n"; Format.fprintf fmt "}@]@.";
() ()
let pp buf t =
let fmt = Format.formatter_of_buffer buf in
print fmt t;
Format.pp_print_flush fmt ()
let pp_single name buf t = pp buf (singleton ~name t) let pp_single name buf t = pp buf (singleton ~name t)
end end

View file

@ -33,6 +33,7 @@ type 'a sequence = ('a -> unit) -> unit
type 'a gen = unit -> 'a option type 'a gen = unit -> 'a option
type 'a klist = unit -> [`Nil | `Cons of 'a * 'a klist] type 'a klist = unit -> [`Nil | `Cons of 'a * 'a klist]
type 'a printer = Buffer.t -> 'a -> unit type 'a printer = Buffer.t -> 'a -> unit
type 'a formatter = Format.formatter -> 'a -> unit
(** {2 Basics} *) (** {2 Basics} *)
@ -123,5 +124,7 @@ module Dot : sig
(** Print the graph in DOT *) (** Print the graph in DOT *)
val pp_single : string -> attribute list t printer val pp_single : string -> attribute list t printer
val print : graph formatter
end end

View file

@ -147,6 +147,8 @@ val vpad : int -> Box.t -> Box.t
val hpad : int -> Box.t -> Box.t val hpad : int -> Box.t -> Box.t
(** Pad horizontally *) (** Pad horizontally *)
(* TODO: right-align/left-align *)
val grid : ?pad:(Box.t -> Box.t) -> ?bars:bool -> val grid : ?pad:(Box.t -> Box.t) -> ?bars:bool ->
Box.t array array -> Box.t Box.t array array -> Box.t
(** Grid of boxes (no frame between boxes). The matrix is indexed (** Grid of boxes (no frame between boxes). The matrix is indexed