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"
return_term loc
(CicTextualParser2Ast.Binder (`Pi, Cic.Anonymous, Some t1, t2))
]
- | "eq" LEFTA
- [ t1 = term; SYMBOL "="; t2 = term ->
- return_term loc (CicTextualParser2Ast.Appl_symbol ("eq", 0, [t1; t2]))
- ]
- | "add" LEFTA [ (* nothing here by default *) ]
- | "mult" LEFTA [ (* nothing here by default *) ]
- | "inv" NONA [ (* nothing here by default *) ]
- | "simple" NONA
+ | "binder" RIGHTA
[
b = binder; vars = LIST1 IDENT SEP SYMBOL ",";
typ = OPT [ SYMBOL ":"; t = term -> t ];
vars body
in
return_term loc binder
- | sort_kind = [
+ ]
+ | "eq" LEFTA
+ [ t1 = term; SYMBOL "="; t2 = term ->
+ return_term loc (CicTextualParser2Ast.Appl_symbol ("eq", 0, [t1; t2]))
+ ]
+ | "add" LEFTA [ (* nothing here by default *) ]
+ | "mult" LEFTA [ (* nothing here by default *) ]
+ | "inv" NONA [ (* nothing here by default *) ]
+ | "simple" NONA
+ [
+ sort_kind = [
"Prop" -> `Prop | "Set" -> `Set | "Type" -> `Type | "CProp" -> `CProp
] ->
CicTextualParser2Ast.Sort sort_kind
return_term loc (CicTextualParser2Ast.Meta (index, substs))
(* actually "in" and "and" are _not_ keywords. Parsing works anyway
* since applications are required to be bound by parens *)
- | "let"; name = IDENT; SYMBOL <:unicode<def>> (* ≝ *); t1 = term;
+ | "let"; name = IDENT;
+(* SYMBOL <:unicode<def>> (* ≝ *); *)
+ SYMBOL "=";
+ t1 = term;
IDENT "in"; t2 = term ->
return_term loc (CicTextualParser2Ast.LetIn (name, t1, t2))
| "let"; ind_kind = [ "corec" -> `CoInductive | "rec"-> `Inductive ];
defs = LIST1 [
- name = IDENT;
- index = OPT [ PAREN "("; index = INT; PAREN ")" ->
- int_of_string index
- ];
- typ = OPT [ SYMBOL ":"; typ = term -> typ ];
- SYMBOL <:unicode<def>> (* ≝ *); t1 = term ->
- (name, t1, typ, (match index with None -> 1 | Some i -> i))
- ] SEP (IDENT "and");
- IDENT "in"; body = term ->
- return_term loc (CicTextualParser2Ast.LetRec (ind_kind, defs, body))
+ name = IDENT;
+ index = OPT [ PAREN "("; index = NUM; PAREN ")" ->
+ int_of_string index
+ ];
+ typ = OPT [ SYMBOL ":"; typ = term -> typ ];
+(* SYMBOL <:unicode<def>> (* ≝ *); *)
+ SYMBOL "=";
+ t1 = term ->
+ (name, t1, typ, (match index with None -> 1 | Some i -> i))
+ ] SEP (IDENT "and");
+ IDENT "in"; body = term ->
+ return_term loc (CicTextualParser2Ast.LetRec (ind_kind, defs, body))
| outtyp = OPT [ PAREN "["; typ = term; PAREN "]" -> typ ];
"match"; t = term;
SYMBOL ":"; indty = IDENT;
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 =
+ if s = empty then
+ Environment.empty
+ else
+ 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
+