]> matita.cs.unibo.it Git - helm.git/blob - helm/matita/matitaDisambiguator.ml
snapshot, notably:
[helm.git] / helm / matita / matitaDisambiguator.ml
1 (* Copyright (C) 2004, HELM Team.
2  * 
3  * This file is part of HELM, an Hypertextual, Electronic
4  * Library of Mathematics, developed at the Computer Science
5  * Department, University of Bologna, Italy.
6  * 
7  * HELM is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * 
12  * HELM is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with HELM; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20  * MA  02111-1307, USA.
21  * 
22  * For details, see the HELM World-Wide-Web page,
23  * http://helm.cs.unibo.it/
24  *)
25
26 open MatitaTypes
27
28 class parserr () =
29   object
30     method parseTerm = CicTextualParser2.parse_term
31     method parseTactical = CicTextualParser2.parse_tactical
32   end
33
34 class disambiguator
35   ~parserr ~dbd ~(chooseUris: MatitaTypes.choose_uris_callback)
36   ~(chooseInterp: MatitaTypes.choose_interp_callback) ()
37   =
38   let disambiguate_term =
39     let module Callbacks =
40       struct
41         let interactive_user_uri_choice
42           ~selection_mode ?ok ?(enable_button_for_non_vars = true) ~title ~msg
43           ~id uris
44         =
45           chooseUris ~selection_mode ~title ~msg
46             ~nonvars_button:enable_button_for_non_vars uris
47
48         let interactive_interpretation_choice = chooseInterp
49         let input_or_locate_uri ~(title:string) ?id =
50           (* Zack: I try to avoid using this callback. I therefore assume that
51           * the presence of an identifier that can't be resolved via "locate"
52           * query is a syntax error *)
53           let msg = match id with Some id -> id | _ -> "" in
54           raise (Unbound_identifier msg)
55       end
56     in
57     let module Disambiguator = Disambiguate.Make (Callbacks) in
58     Disambiguator.disambiguate_term
59   in
60   object (self)
61     val mutable parserr: parserr = parserr
62     method parserr = parserr
63     method setParserr p = parserr <- p
64
65     val mutable _env = DisambiguateTypes.Environment.empty
66     method env = _env
67     method setEnv e = _env <- e
68
69     method disambiguateTermAst ?(context = []) ?(metasenv = []) ?env termAst =
70       let (save_state, env) =
71         match env with
72         | Some env -> (false, env)
73         | None -> (true, _env)
74       in
75       match disambiguate_term ~initial_ugraph:CicUniv.empty_ugraph 
76         ~dbd context metasenv termAst ~aliases:env with
77       | [ (env, metasenv, term,ugraph) as x ] ->
78           if save_state then self#setEnv env;
79           x
80       | _ -> assert false
81
82     method disambiguateTermAsts ?(metasenv = []) ?env asts =
83       let ast = CicAst.pack asts in
84       let (env, metasenv, term, ugraph) =
85         self#disambiguateTermAst ~context:[] ~metasenv ?env ast
86       in
87       (env, metasenv, CicUtil.unpack term, ugraph)
88
89     method disambiguateTerm ?context ?metasenv ?env stream =
90       self#disambiguateTermAst ?context ?metasenv ?env
91         (parserr#parseTerm stream)
92   end
93