X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fcommon%2Flibrary.ml;h=ff4c54198832220c4154e44d7a62ef3da1a50318;hb=f7bb626faf6b9d89c0ee5ac48b1d97c69d189f8a;hp=1238c273986b760d9af759a564902d6e5b18b7f7;hpb=a9f15ca61aac8089fb4b599af72533c4a432ba7b;p=helm.git diff --git a/helm/software/lambda-delta/common/library.ml b/helm/software/lambda-delta/common/library.ml index 1238c2739..ff4c54198 100644 --- a/helm/software/lambda-delta/common/library.ml +++ b/helm/software/lambda-delta/common/library.ml @@ -9,11 +9,12 @@ \ / This software is distributed as is, NO WARRANTY. V_______________________________________________________________ *) -module F = Filename +module F = Format +module N = Filename module U = NUri +module C = Cps module H = Hierarchy - -type 'a out = (unit -> 'a) -> string -> 'a +module Y = Entity (* internal functions *******************************************************) @@ -21,55 +22,156 @@ let base = "xml" let obj_ext = ".xml" +let root = "ENTITY" + let system = "http://helm.cs.unibo.it/lambda-delta/" ^ base ^ "/ld.dtd" let path_of_uri uri = - F.concat base (Str.string_after (U.string_of_uri uri) 3) + N.concat base (Str.string_after (U.string_of_uri uri) 3) let pp_head frm = - Format.fprintf frm "@,@," "1.0" "UTF-8" + F.fprintf frm "@,@," "1.0" "UTF-8" let pp_doctype frm = - Format.fprintf frm "@,@," system + F.fprintf frm "@,@," system -let open_entry si g frm = +let open_entity si g frm = let opts = if si then "si" else "" in let f shp = - Format.fprintf frm "" shp opts + F.fprintf frm "" shp opts in H.string_of_graph f g -let close_entry frm = - Format.fprintf frm "" +let close_entity frm = + F.fprintf frm "" + +let name frm a = + let f s = function + | true -> F.fprintf frm " name=%S" s + | false -> F.fprintf frm " name=%S" ("^" ^ s) + in + Y.name C.start f a + +let pp_entity pp_term frm = function + | a, u, Y.Abst w -> + let str = U.string_of_uri u in + let a = Y.Name (U.name_of_uri u, true) :: a in + F.fprintf frm "%a" str name a pp_term w + | a, u, Y.Abbr v -> + let str = U.string_of_uri u in + let a = Y.Name (U.name_of_uri u, true) :: a in + F.fprintf frm "%a" str name a pp_term v + +let pp_boxed pp_term frm entity = + F.fprintf frm "@,@[ %a@]@," (pp_entity pp_term) entity (* interface functions ******************************************************) -let old_export_entity export_entry si g = function - | Some entry -> - let _, uri, bind = entry in - let path = path_of_uri uri in - let _ = Sys.command (Printf.sprintf "mkdir -p %s" (F.dirname path)) in - let och = open_out (path ^ obj_ext) in - let frm = Format.formatter_of_out_channel och in - Format.pp_set_margin frm max_int; - Format.fprintf frm "@[%t%t%t%a%t@]@." - pp_head pp_doctype (open_entry si g) export_entry entry close_entry; - close_out och - | None -> () +let old_export_entity pp_term si g entity = + let _, uri, _ = entity in + let path = path_of_uri uri in + let _ = Sys.command (Printf.sprintf "mkdir -p %s" (N.dirname path)) in + let och = open_out (path ^ obj_ext) in + let frm = F.formatter_of_out_channel och in + F.pp_set_margin frm max_int; + F.fprintf frm "@[%t%t%t%a%t@]@." + pp_head pp_doctype + (open_entity si g) (pp_boxed pp_term) entity close_entity; + close_out och + +let old_name = name (****************************************************************************) -(* -let export_entity export_entry si g = function - | Some entry -> - let _, uri, bind = entry in - let path = path_of_uri root uri in - let _ = Sys.command (Printf.sprintf "mkdir -p %s" (F.dirname path)) in - let och = open_out (path ^ obj_ext) in - let out f s = output_string och s; f () in - let f () = close_out och in - - Format.fprintf frm "@[%t%t%t%a%t@]@." - pp_head pp_doctype (open_entry si g) export_entry entry close_entry; - close_out och - | None -> () -*) + +type och = string -> unit + +type attr = string * string + +type pp = och -> int -> unit + +let attribute out (name, contents) = + if contents <> "" then begin + out " "; out name; out "=\""; out contents; out "\"" + end + +let xml out version encoding = + out "\n\n" + +let doctype out root system = + out "\n\n" + +let tag tag attrs ?contents out indent = + let spc = String.make indent ' ' in + out spc; out "<"; out tag; List.iter (attribute out) attrs; + match contents with + | None -> out "/>\n" + | Some cont -> + out ">\n"; cont out (indent + 3); out spc; + out "\n" + +let sort = "Sort" + +let lref = "LRef" + +let gref = "GRef" + +let cast = "Cast" + +let appl = "Appl" + +let proj = "Proj" + +let abst = "Abst" + +let abbr = "Abbr" + +let void = "Void" + +let position i = + "position", string_of_int i + +let offset j = + let contents = if j > 0 then string_of_int j else "" in + "offset", contents + +let uri u = + "uri", U.string_of_uri u + +let arity n = + let contents = if n > 1 then string_of_int n else "" in + "arity", contents + +let name a = + let map f i n r s = + let n = if r then n else "^" ^ n in + let spc = if i then "" else " " in + f (s ^ n ^ spc) + in + let f s = "name", s in + Y.names f map a "" + +let mark a = + let err () = "mark", "" in + let f i = "mark", string_of_int i in + Y.mark err f a + +let export_entity pp_term si g (a, u, b) = + let path = path_of_uri u in + let _ = Sys.command (Printf.sprintf "mkdir -p %s" (N.dirname path)) in + let och = open_out (path ^ obj_ext) in + let out = output_string och in + xml out "1.0" "UTF-8"; doctype out root system; + let a = Y.Name (U.name_of_uri u, true) :: a in + let attrs = [uri u; name a; mark a] in + let contents = match b with + | Y.Abst w -> tag "ABST" attrs ~contents:(pp_term w) + | Y.Abbr v -> tag "ABBR" attrs ~contents:(pp_term v) + in + let opts = if si then "si" else "" in + let shp = H.string_of_graph C.start g in + let attrs = ["hierarchy", shp; "options", opts] in + tag root attrs ~contents out 0; + close_out och