]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/interface/cicParser3.ml
Initial revision
[helm.git] / helm / interface / cicParser3.ml
diff --git a/helm/interface/cicParser3.ml b/helm/interface/cicParser3.ml
new file mode 100644 (file)
index 0000000..d0c31b0
--- /dev/null
@@ -0,0 +1,515 @@
+(******************************************************************************)
+(*                                                                            *)
+(*                               PROJECT HELM                                 *)
+(*                                                                            *)
+(*                Claudio Sacerdoti Coen <sacerdot@cs.unibo.it>               *)
+(*                                 24/01/2000                                 *)
+(*                                                                            *)
+(* This module is the terms level of a parser for cic objects from xml        *)
+(* files to the internal representation. It is used by the module cicParser2  *)
+(* (objects level). It defines an extension of the standard dom using the     *)
+(* object-oriented extension machinery of markup: an object with a method     *)
+(* to_cic_term that returns the internal representation of the subtree is     *)
+(* added to each node of the dom tree                                         *)
+(*                                                                            *)
+(******************************************************************************)
+
+exception IllFormedXml of int;;
+
+(* The hashtable from the current identifiers to the object or the terms *)
+let ids_to_targets = ref None;;
+
+(* The list of tokens of the current section path. *)
+(* Used to resolve relative URIs                   *)
+let current_sp = ref [];;
+
+(* The uri of the object been parsed *)
+let current_uri = ref (UriManager.uri_of_string "cic:/.xml");;
+
+(* True if annotation really matter *)
+let process_annotations = ref false;;
+
+(* Utility functions to map a markup attribute to something useful *)
+
+let cic_attr_of_xml_attr =
+ function
+    Pxp_types.Value s       -> Cic.Name s
+  | Pxp_types.Implied_value -> Cic.Anonimous
+  | _             -> raise (IllFormedXml 1)
+
+let cic_sort_of_xml_attr =
+ function
+    Pxp_types.Value "Prop" -> Cic.Prop
+  | Pxp_types.Value "Set"  -> Cic.Set
+  | Pxp_types.Value "Type" -> Cic.Type
+  | _            -> raise (IllFormedXml 2)
+
+let int_of_xml_attr =
+ function
+    Pxp_types.Value n -> int_of_string n
+  | _       -> raise (IllFormedXml 3)
+
+let uri_of_xml_attr =
+ function
+    Pxp_types.Value s -> UriManager.uri_of_string s
+  | _       -> raise (IllFormedXml 4)
+
+let string_of_xml_attr =
+ function
+    Pxp_types.Value s -> s
+  | _       -> raise (IllFormedXml 5)
+
+let binder_of_xml_attr =
+ function
+    Pxp_types.Value s -> if !process_annotations then Some s else None
+  | _       -> raise (IllFormedXml 17)
+;;
+
+let register_id id node =
+ if !process_annotations then
+  match !ids_to_targets with
+     None -> assert false
+   | Some ids_to_targets ->
+      Hashtbl.add ids_to_targets id (Cic.Term node)
+;;
+
+(* the "interface" of the class linked to each node of the dom tree *)
+
+class virtual cic_term =
+  object (self)
+
+    (* fields and methods ever required by markup *)
+    val mutable node = (None : cic_term Pxp_document.node option)
+
+    method clone = {< >} 
+    method node =
+      match node with
+          None ->
+            assert false
+        | Some n -> n
+    method set_node n =
+      node <- Some n
+
+    (* a method that returns the internal representation of the tree (term) *)
+    (* rooted in this node                                                  *)
+    method virtual to_cic_term : Cic.annterm
+  end
+;;
+
+(* the class of the objects linked to nodes that are not roots of cic terms *)
+class eltype_not_of_cic =
+  object (self)
+
+     inherit cic_term
+
+     method to_cic_term = raise (IllFormedXml 6)
+  end
+;;
+
+(* the class of the objects linked to nodes whose content is a cic term *)
+(* (syntactic sugar xml entities) e.g. <type> ... </type>               *)
+class eltype_transparent =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      match n#sub_nodes with
+         [ t ]  -> t#extension#to_cic_term
+       | _  -> raise (IllFormedXml 7)
+  end
+;;
+
+(* A class for each cic node type *)
+
+class eltype_fix =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let nofun = int_of_xml_attr (n#attribute "noFun")
+      and id = string_of_xml_attr (n#attribute "id")
+      and functions =
+       let sons = n#sub_nodes in
+        List.map
+         (function
+             f when f#node_type = Pxp_document.T_element "FixFunction" ->
+              let name = string_of_xml_attr (f#attribute "name")
+              and recindex = int_of_xml_attr (f#attribute "recIndex")
+              and (ty, body) =
+               match f#sub_nodes with
+                  [t ; b] when
+                    t#node_type = Pxp_document.T_element "type" &&
+                    b#node_type = Pxp_document.T_element "body" ->
+                     (t#extension#to_cic_term, b#extension#to_cic_term)
+                | _ -> raise (IllFormedXml 14)
+              in
+               (name, recindex, ty, body)
+           | _ -> raise (IllFormedXml 13)
+         ) sons
+      in
+       let res = Cic.AFix (id, ref None, nofun, functions) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_cofix =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let nofun = int_of_xml_attr (n#attribute "noFun")
+      and id = string_of_xml_attr (n#attribute "id")
+      and functions =
+       let sons = n#sub_nodes in
+        List.map
+         (function
+             f when f#node_type = Pxp_document.T_element "CofixFunction" ->
+              let name = string_of_xml_attr (f#attribute "name")
+              and (ty, body) =
+               match f#sub_nodes with
+                  [t ; b] when
+                    t#node_type = Pxp_document.T_element "type" &&
+                    b#node_type = Pxp_document.T_element "body" ->
+                     (t#extension#to_cic_term, b#extension#to_cic_term)
+                | _ -> raise (IllFormedXml 16)
+              in
+               (name, ty, body)
+           | _ -> raise (IllFormedXml 15)
+         ) sons
+      in
+       let res = Cic.ACoFix (id, ref None, nofun, functions) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_implicit =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let id = string_of_xml_attr (n#attribute "id") in
+       let res = Cic.AImplicit (id, ref None) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_rel =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let value  = int_of_xml_attr (n#attribute "value")
+      and binder = binder_of_xml_attr (n#attribute "binder")
+      and id = string_of_xml_attr (n#attribute "id") in
+       let res = Cic.ARel (id,ref None,value,binder) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_meta =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let value = int_of_xml_attr (n#attribute "no")
+      and id = string_of_xml_attr (n#attribute "id") in
+       let res = Cic.AMeta (id,ref None,value) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_var =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let name = string_of_xml_attr (n#attribute "relUri")
+      and xid = string_of_xml_attr (n#attribute "id") in
+       match Str.split (Str.regexp ",") name with
+          [index; id] ->
+           let get_prefix n =
+            let rec aux =
+             function
+                (0,_) -> "/"
+              | (n,he::tl) when n > 0 -> "/" ^ he ^ aux (n - 1, tl)
+              | _ -> raise (IllFormedXml 19)
+            in   
+             aux (List.length !current_sp - n,!current_sp)
+           in
+            let res =
+             Cic.AVar
+              (xid,ref None, 
+               (UriManager.uri_of_string
+                ("cic:" ^ get_prefix (int_of_string index) ^ id ^ ".var"))
+              )
+            in
+             register_id id res ;
+             res
+        | _ -> raise (IllFormedXml 18)
+  end
+;;
+
+class eltype_apply =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let children = n#sub_nodes
+      and id = string_of_xml_attr (n#attribute "id") in
+       if List.length children < 2 then raise (IllFormedXml 8)
+       else
+        let res =
+         Cic.AAppl
+          (id,ref None,List.map (fun x -> x#extension#to_cic_term) children)
+        in
+         register_id id res ;
+         res
+  end
+;;
+
+class eltype_cast =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let sons = n#sub_nodes
+      and id = string_of_xml_attr (n#attribute "id") in
+       match sons with
+          [te ; ty] when
+            te#node_type = Pxp_document.T_element "term" &&
+            ty#node_type = Pxp_document.T_element "type" ->
+             let term = te#extension#to_cic_term
+             and typ  = ty#extension#to_cic_term in
+              let res = Cic.ACast (id,ref None,term,typ) in
+               register_id id res ;
+               res
+        | _  -> raise (IllFormedXml 9)
+  end
+;;
+
+class eltype_sort =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let sort = cic_sort_of_xml_attr (n#attribute "value")
+      and id = string_of_xml_attr (n#attribute "id") in
+       let res = Cic.ASort (id,ref None,sort) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_abst =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let value = uri_of_xml_attr (n#attribute "uri")
+      and id = string_of_xml_attr (n#attribute "id") in
+       let res = Cic.AAbst (id,ref None,value) in
+        register_id id res ;
+        res
+  end
+;;
+
+class eltype_const =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let module U = UriManager in
+      let n = self#node in
+       let value = uri_of_xml_attr (n#attribute "uri")
+       and id = string_of_xml_attr (n#attribute "id") in
+        let res =
+         Cic.AConst (id,ref None,value, U.relative_depth !current_uri value 0)
+        in
+         register_id id res ;
+         res
+  end
+;;
+
+class eltype_mutind =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let module U = UriManager in
+      let n = self#node in
+       let name = uri_of_xml_attr (n#attribute "uri")
+       and noType = int_of_xml_attr (n#attribute "noType")
+       and id = string_of_xml_attr (n#attribute "id") in
+        let res =
+         Cic.AMutInd
+          (id,ref None,name, U.relative_depth !current_uri name 0, noType)
+        in
+         register_id id res ;
+         res
+  end
+;;
+
+class eltype_mutconstruct =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let module U = UriManager in
+      let n = self#node in
+       let name = uri_of_xml_attr (n#attribute "uri")
+       and noType = int_of_xml_attr (n#attribute "noType")
+       and noConstr = int_of_xml_attr (n#attribute "noConstr")
+       and id = string_of_xml_attr (n#attribute "id") in
+        let res = 
+         Cic.AMutConstruct
+          (id, ref None, name, U.relative_depth !current_uri name 0,
+          noType, noConstr)
+        in
+         register_id id res ;
+         res
+  end
+;;
+
+class eltype_prod =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let sons = n#sub_nodes
+      and id = string_of_xml_attr (n#attribute "id") in
+       match sons with
+          [s ; t] when
+            s#node_type = Pxp_document.T_element "source" &&
+            t#node_type = Pxp_document.T_element "target" ->
+             let name = cic_attr_of_xml_attr (t#attribute "binder")
+             and source = s#extension#to_cic_term
+             and target = t#extension#to_cic_term in
+              let res = Cic.AProd (id,ref None,name,source,target) in
+               register_id id res ;
+               res
+        | _  -> raise (IllFormedXml 10)
+  end
+;;
+
+class eltype_mutcase =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let module U = UriManager in
+      let n = self#node in
+       let sons = n#sub_nodes
+       and id = string_of_xml_attr (n#attribute "id") in
+        match sons with
+           ty::te::patterns when
+             ty#node_type = Pxp_document.T_element "patternsType" &&
+             te#node_type = Pxp_document.T_element "inductiveTerm" ->
+              let ci = uri_of_xml_attr (n#attribute "uriType")
+              and typeno = int_of_xml_attr (n#attribute "noType")
+              and inductiveType = ty#extension#to_cic_term
+              and inductiveTerm = te#extension#to_cic_term
+              and lpattern= List.map (fun x -> x#extension#to_cic_term) patterns
+              in
+               let res =
+                Cic.AMutCase (id,ref None,ci,U.relative_depth !current_uri ci 0,
+                 typeno,inductiveType,inductiveTerm,lpattern)
+               in
+                register_id id res ;
+                res
+         | _  -> raise (IllFormedXml 11)
+  end
+;;
+
+class eltype_lambda =
+  object (self)
+
+    inherit cic_term
+
+    method to_cic_term =
+     let n = self#node in
+      let sons = n#sub_nodes
+      and id = string_of_xml_attr (n#attribute "id") in
+       match sons with
+          [s ; t] when
+            s#node_type = Pxp_document.T_element "source" &&
+            t#node_type = Pxp_document.T_element "target" ->
+             let name = cic_attr_of_xml_attr (t#attribute "binder")
+             and source = s#extension#to_cic_term
+             and target = t#extension#to_cic_term in
+              let res = Cic.ALambda (id,ref None,name,source,target) in
+               register_id id res ;
+               res
+        | _  -> raise (IllFormedXml 12)
+  end
+;;
+
+(* The definition of domspec, an hashtable that maps each node type to the *)
+(* object that must be linked to it. Used by markup.                       *)
+
+let domspec =
+ let module D = Pxp_document in
+  D.make_spec_from_alist
+   ~data_exemplar: (new D.data_impl (new eltype_not_of_cic))
+   ~default_element_exemplar: (new D.element_impl (new eltype_not_of_cic))
+   ~element_alist:
+    [ "REL",           (new D.element_impl (new eltype_rel)) ;
+      "VAR",           (new D.element_impl (new eltype_var)) ;
+      "META",          (new D.element_impl (new eltype_meta)) ;
+      "SORT",          (new D.element_impl (new eltype_sort)) ;
+      "IMPLICIT",      (new D.element_impl (new eltype_implicit)) ;
+      "CAST",          (new D.element_impl (new eltype_cast)) ;
+      "PROD",          (new D.element_impl (new eltype_prod)) ;
+      "LAMBDA",        (new D.element_impl (new eltype_lambda)) ;
+      "APPLY",         (new D.element_impl (new eltype_apply)) ;
+      "CONST",         (new D.element_impl (new eltype_const)) ;
+      "ABST",          (new D.element_impl (new eltype_abst)) ;
+      "MUTIND",        (new D.element_impl (new eltype_mutind)) ;
+      "MUTCONSTRUCT",  (new D.element_impl (new eltype_mutconstruct)) ;
+      "MUTCASE",       (new D.element_impl (new eltype_mutcase)) ;
+      "FIX",           (new D.element_impl (new eltype_fix)) ;
+      "COFIX",         (new D.element_impl (new eltype_cofix)) ;
+      "arity",         (new D.element_impl (new eltype_transparent)) ;
+      "term",          (new D.element_impl (new eltype_transparent)) ;
+      "type",          (new D.element_impl (new eltype_transparent)) ;
+      "body",          (new D.element_impl (new eltype_transparent)) ;
+      "source",        (new D.element_impl (new eltype_transparent)) ;
+      "target",        (new D.element_impl (new eltype_transparent)) ;
+      "patternsType",  (new D.element_impl (new eltype_transparent)) ;
+      "inductiveTerm", (new D.element_impl (new eltype_transparent)) ;
+      "pattern",       (new D.element_impl (new eltype_transparent))
+    ]
+   ()
+;;