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 _ ->
      ()