]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_disambiguation/cicTextualParser2.ml
- factorized DisambiguateChoices module
[helm.git] / helm / ocaml / cic_disambiguation / cicTextualParser2.ml
index 030fa593836bb97f549d8c1b7cb77682b13165b2..bca1cdba639c2ac89f49dfac27e17c94004fa010 100644 (file)
@@ -35,7 +35,11 @@ open Printf
 
 exception Parse_error of string
 
-let grammar = Grammar.gcreate CicTextualLexer2.lex
+let choice_of_uri (uri: string) =
+  let cic = HelmLibraryObjects.term_of_uri (UriManager.uri_of_string uri) in
+  (uri, (fun _ _ _ -> cic))
+
+let grammar = Grammar.gcreate CicTextualLexer2.cic_lexer
 
 let term = Grammar.Entry.create grammar "term"
 let term0 = Grammar.Entry.create grammar "term0"
@@ -176,3 +180,73 @@ let parse_term stream =
     raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
         (Printexc.to_string exn)))
 
+(**/**)
+
+(** {2 Interface for gTopLevel} *)
+
+open DisambiguateTypes
+
+module EnvironmentP3 =
+  struct
+    type t = environment
+
+    let empty = ""
+
+    let aliases_grammar = Grammar.gcreate CicTextualLexer2.cic_lexer
+    let aliases = Grammar.Entry.create aliases_grammar "aliases"
+
+    let to_string env =
+      let aliases =
+        Environment.fold
+          (fun domain_item (dsc, _) acc ->
+            let s =
+              match domain_item with
+              | Id id -> sprintf "alias id %s = %s" id dsc
+              | Symbol (symb, instance) ->
+                  sprintf "alias symbol \"%s\" (instance %d) = \"%s\""
+                    symb instance dsc
+              | Num instance ->
+                  sprintf "alias num (instance %d) = \"%s\"" instance dsc
+            in
+            s :: acc)
+          env []
+      in
+      String.concat "\n" (List.sort compare aliases)
+
+    EXTEND
+      GLOBAL: aliases;
+      aliases: [  (* build an environment from an aliases list *)
+        [ aliases = LIST0 alias; EOI ->
+            List.fold_left
+              (fun env (domain_item, codomain_item) ->
+                Environment.add domain_item codomain_item env)
+              Environment.empty aliases
+        ]
+      ];
+      alias: [  (* return a pair <domain_item, codomain_item> from an alias *)
+        [ IDENT "alias";
+          choice =
+            [ IDENT "id"; id = IDENT; SYMBOL "="; uri = URI ->
+                (Id id, choice_of_uri uri)
+            | IDENT "symbol"; symbol = QSTRING;
+              PAREN "("; IDENT "instance"; instance = NUM; PAREN ")";
+              SYMBOL "="; dsc = QSTRING ->
+                (Symbol (symbol, int_of_string instance),
+                 DisambiguateChoices.lookup_symbol_by_dsc symbol dsc)
+            | IDENT "num";
+              PAREN "("; IDENT "instance"; instance = NUM; PAREN ")";
+              SYMBOL "="; dsc = QSTRING ->
+                (Num (int_of_string instance),
+                 DisambiguateChoices.lookup_num_by_dsc dsc)
+            ] -> choice ]
+      ];
+    END
+
+    let of_string s =
+      try
+        Grammar.Entry.parse aliases (Stream.of_string s)
+      with Stdpp.Exc_located ((x, y), exn) ->
+        raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
+          (Printexc.to_string exn)))
+  end
+