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"
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
+