let rec generate_structure fmt report_ele =
match report_ele with
Leaf l ->
p fmt ("Leaf (fun () -> "^l.leaf^")")
| Sub s ->
p fmt ("Sub { sub_rep = (fun () -> Report.coerce ("^s.sub_code^")); }")
| Mark m ->
p fmt
("Tag { tag = \"a\" ; atts = [(\"name\", "^
"fun () -> \""^(escape m.mark_name)^"\")] ; tag_subs = [] }")
| Tag t ->
let f (att, code) =
"(\""^(escape att)^"\", "^
"fun () -> "^code^")"
in
p fmt
("Tag { tag = \""^(escape t.tag)^"\" ; "^
"atts = ["^(String.concat " ; " (List.map f t.atts))^"] ; "^
"tag_subs = \n[\n");
List.iter
(fun ele ->
generate_structure fmt ele ;
p fmt ";\n"
)
t.tag_subs;
p fmt "\n] }\n"
| List list ->
p fmt
("( let "^list.var^"_ = { "^
"f = (fun () -> "^list.f^") ; "^
"list_subs = (fun "^list.var^" -> \n[\n");
List.iter
(fun ele ->
generate_structure fmt ele ;
p fmt ";\n"
)
list.list_subs;
p fmt ("\n]) }\nin List (Report.coerce "^list.var^"_))")
| Cond c ->
p fmt
("Cond { cond = (fun () -> "^c.cond^") ; "^
"subs_then = \n[\n");
List.iter
(fun ele ->
generate_structure fmt ele ;
p fmt ";\n"
)
c.subs_then;
p fmt "\n] ;\nsubs_else = \n[\n" ;
List.iter
(fun ele ->
generate_structure fmt ele ;
p fmt ";\n"
)
c.subs_else;
p fmt "\n] }\n"
| Else _ | Then _ ->
()