X-Git-Url: http://matita.cs.unibo.it/gitweb/?p=helm.git;a=blobdiff_plain;f=components%2Flexicon%2FcicNotation.ml;fp=components%2Flexicon%2FcicNotation.ml;h=bea67a0b4bbf9a9f54d1b28fd310466eaa83fad3;hp=0000000000000000000000000000000000000000;hb=f61af501fb4608cc4fb062a0864c774e677f0d76;hpb=58ae1809c352e71e7b5530dc41e2bfc834e1aef1 diff --git a/components/lexicon/cicNotation.ml b/components/lexicon/cicNotation.ml new file mode 100644 index 000000000..bea67a0b4 --- /dev/null +++ b/components/lexicon/cicNotation.ml @@ -0,0 +1,102 @@ +(* Copyright (C) 2005, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +(* $Id$ *) + +open LexiconAst + +type notation_id = + | RuleId of CicNotationParser.rule_id + | InterpretationId of TermAcicContent.interpretation_id + | PrettyPrinterId of TermContentPres.pretty_printer_id + +let parser_ref_counter = RefCounter.create () +let rule_ids_to_items = Hashtbl.create 113 + +let process_notation st = + match st with + | Notation (loc, dir, l1, associativity, precedence, l2) -> + let item = (l1, precedence, associativity, l2) in + let rule_id = ref [] in + let _ = + if dir <> Some `RightToLeft then + let create_cb (l1, precedence, associativity, l2) = + let id = + CicNotationParser.extend l1 ?precedence ?associativity + (fun env loc -> + CicNotationPt.AttributedTerm + (`Loc loc,TermContentPres.instantiate_level2 env l2)) in + rule_id := [ RuleId id ]; + Hashtbl.add rule_ids_to_items id item + in + RefCounter.incr ~create_cb parser_ref_counter item + in + let pp_id = + if dir <> Some `LeftToRight then + [ PrettyPrinterId + (TermContentPres.add_pretty_printer ?precedence ?associativity + l2 l1) ] + else + [] + in + !rule_id @ pp_id + | Interpretation (loc, dsc, l2, l3) -> + let interp_id = TermAcicContent.add_interpretation dsc l2 l3 in + [InterpretationId interp_id] + | st -> [] + +let remove_notation = function + | RuleId id -> + let item = + try + Hashtbl.find rule_ids_to_items id + with Not_found -> assert false in + RefCounter.decr ~delete_cb:(fun _ -> CicNotationParser.delete id) + parser_ref_counter item + | PrettyPrinterId id -> TermContentPres.remove_pretty_printer id + | InterpretationId id -> TermAcicContent.remove_interpretation id + +let get_all_notations () = + List.map + (fun (interp_id, dsc) -> + InterpretationId interp_id, "interpretation: " ^ dsc) + (TermAcicContent.get_all_interpretations ()) + +let get_active_notations () = + List.map (fun id -> InterpretationId id) + (TermAcicContent.get_active_interpretations ()) + +let set_active_notations ids = + let interp_ids = + HExtlib.filter_map + (function InterpretationId interp_id -> Some interp_id | _ -> None) + ids + in + TermAcicContent.set_active_interpretations interp_ids + +let reset () = + TermContentPres.reset (); + TermAcicContent.reset () +;;