]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/matita/matitaDisambiguator.ml
- changed license to lgpl
[helm.git] / helm / matita / matitaDisambiguator.ml
index 183e775d0630e4b24c6433f455e5aa52d61adc52..178c7d8c7f18372fc4c1b768470c4e09d2183921 100644 (file)
  * http://helm.cs.unibo.it/
  *)
 
+open MatitaTypes
+
 class parserr () =
   object
-    method parseTerm (stream: char Stream.t) =
-      CicTextualParser2.parse_term stream
-
-      (* TODO Zack: implements methods below *)
-    method parseTactic (_: char Stream.t) : DisambiguateTypes.tactic =
-      MatitaTypes.not_implemented "parserr.parseTactic"
-    method parseTactical (_: char Stream.t) : DisambiguateTypes.tactical =
-      MatitaTypes.not_implemented "parserr.parseTactical"
-    method parseCommand (_: char Stream.t) : DisambiguateTypes.command =
-      MatitaTypes.not_implemented "parserr.parseCommand"
-    method parseScript (_: char Stream.t) : DisambiguateTypes.script =
-      MatitaTypes.not_implemented "parserr.parseScript"
+    method parseTerm = CicTextualParser2.parse_term
+    method parseTactical = CicTextualParser2.parse_tactical
   end
 
-class disambiguator
-  ~parserr ~mqiconn ~(chooseUris: MatitaTypes.choose_uris_callback)
-  ~(chooseInterp: MatitaTypes.choose_interp_callback) ()
-  =
+let parserr () = new parserr ()
+let parserr_instance = MatitaMisc.singleton parserr
+
+class disambiguator () =
+  let _chooseUris = ref mono_uris_callback in
+  let _chooseInterp = ref mono_interp_callback in
   let disambiguate_term =
     let module Callbacks =
       struct
@@ -50,33 +44,63 @@ class disambiguator
           ~selection_mode ?ok ?(enable_button_for_non_vars = true) ~title ~msg
           ~id uris
         =
-          chooseUris ~selection_mode ~title ~msg
+          !_chooseUris ~selection_mode ~title ~msg
             ~nonvars_button:enable_button_for_non_vars uris
 
-        let interactive_interpretation_choice = chooseInterp
-        let input_or_locate_uri ~(title:string) =
-          (* TODO Zack: I try to avoid using this callback. I therefore assume
-           * that the presence of an identifier that can't be resolved via
-           * "locate" query is a syntax error *)
-          MatitaTypes.not_implemented
-            "MatitaDisambiguator: input_or_locate_uri callback"
+        let interactive_interpretation_choice interp = !_chooseInterp interp
+
+        let input_or_locate_uri ~(title:string) ?id =
+          (* Zack: I try to avoid using this callback. I therefore assume that
+          * the presence of an identifier that can't be resolved via "locate"
+          * query is a syntax error *)
+          let msg = match id with Some id -> id | _ -> "_" in
+          raise (Unbound_identifier msg)
       end
     in
     let module Disambiguator = Disambiguate.Make (Callbacks) in
-    Disambiguator.disambiguate_term
+    Disambiguator.disambiguate_term 
   in
   object (self)
-    val mutable parserr: parserr = parserr
+    val mutable _env = DisambiguateTypes.Environment.empty
+    method env = _env
+    method setEnv e = _env <- e
+
+    method chooseUris = !_chooseUris
+    method setChooseUris f = _chooseUris := f
+
+    method chooseInterp = !_chooseInterp
+    method setChooseInterp f = _chooseInterp := f
+
+    val parserr = parserr_instance ()
     method parserr = parserr
-    method setParserr p = parserr <- p
 
-    method disambiguateTermAst
-      ~context ~metasenv ?(env = DisambiguateTypes.Environment.empty) termAst
-    =
-      disambiguate_term mqiconn context metasenv termAst ~aliases:env
+    val dbd = MatitaMisc.dbd_instance ()
+
+    method disambiguateTermAst ?(context = []) ?(metasenv = []) ?env termAst =
+      let (save_state, env) =
+        match env with
+        | Some env -> (false, env)
+        | None -> (true, _env)
+      in
+      match disambiguate_term ~initial_ugraph:CicUniv.empty_ugraph 
+       ~dbd context metasenv termAst ~aliases:env with
+      | [ (env, metasenv, term,ugraph) as x ] ->
+          if save_state then self#setEnv env;
+          x
+      | _ -> assert false
 
-    method disambiguateTerm ~context ~metasenv ?env stream =
-      self#disambiguateTermAst ~context ~metasenv ?env
+    method disambiguateTermAsts ?(metasenv = []) ?env asts =
+      let ast = CicAst.pack asts in
+      let (env, metasenv, term, ugraph) =
+        self#disambiguateTermAst ~context:[] ~metasenv ?env ast
+      in
+      (env, metasenv, CicUtil.unpack term, ugraph)
+
+    method disambiguateTerm ?context ?metasenv ?env stream =
+      self#disambiguateTermAst ?context ?metasenv ?env
         (parserr#parseTerm stream)
   end
 
+let disambiguator () = new disambiguator ()
+let instance = MatitaMisc.singleton disambiguator 
+