X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Flambda-delta%2Fcommon%2Flibrary.ml;h=91272c6f839c10bffef60ad44d47ed1334e93ec5;hb=5dcae34c6e44a40e236db641f59ddb096d1a16ec;hp=80e9c59daabb351d965ad4087e85e928aafe49ee;hpb=c8011c7ad75be5d03c4d4bb2e6900af32ad65c07;p=helm.git diff --git a/helm/software/lambda-delta/common/library.ml b/helm/software/lambda-delta/common/library.ml index 80e9c59da..91272c6f8 100644 --- a/helm/software/lambda-delta/common/library.ml +++ b/helm/software/lambda-delta/common/library.ml @@ -11,44 +11,116 @@ module F = Filename module U = NUri +module C = Cps module H = Hierarchy +module Y = Entity (* internal functions *******************************************************) -let obj_ext = ".ld.xml" +let base = "xml" -let system = "http://helm.cs.unibo.it/lambda-delta/xml/ld.dtd" +let obj_ext = ".xml" -let path_of_uri base uri = +let root = "ENTITY" + +let system = "http://helm.cs.unibo.it/lambda-delta/" ^ base ^ "/ld.dtd" + +let path_of_uri xdir uri = + let base = F.concat xdir base in F.concat base (Str.string_after (U.string_of_uri uri) 3) -let pp_head frm = - Format.fprintf frm "@,@," "1.0" "UTF-8" +(* interface functions ******************************************************) -let pp_doctype frm = - Format.fprintf frm "@,@," system +type och = string -> unit -let open_kernel si g frm = - let opts = if si then "si" else "" in - let f shp = - Format.fprintf frm "" shp opts - in - H.string_of_graph f g +type attr = string * string -let close_kernel frm = - Format.fprintf frm "" +type pp = och -> int -> unit -(* interface functions ******************************************************) +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 export_item export_obj si g base = function - | Some obj -> - let _, uri, bind = obj in - let path = path_of_uri base 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_kernel si g) export_obj obj close_kernel; - close_out och - | None -> () +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 xdir (a, u, b) = + let path = path_of_uri xdir u in + let _ = Sys.command (Printf.sprintf "mkdir -p %s" (F.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) + | Y.Void -> assert false + in + let opts = if si then "si" else "" in + let shp = H.string_of_graph () in + let attrs = ["hierarchy", shp; "options", opts] in + tag root attrs ~contents out 0; + close_out och