src/Pure/Syntax/syntax.ML
changeset 42204 b3277168c1e7
parent 42134 4bc55652c685
child 42205 22f5cc06c419
--- a/src/Pure/Syntax/syntax.ML	Sun Apr 03 18:17:21 2011 +0200
+++ b/src/Pure/Syntax/syntax.ML	Sun Apr 03 21:59:33 2011 +0200
@@ -116,17 +116,20 @@
   val ambiguity_level_raw: Config.raw
   val ambiguity_level: int Config.T
   val ambiguity_limit: int Config.T
-  val standard_parse_term: (term -> string option) -> term_context ->
-    Proof.context -> syntax -> string -> Symbol_Pos.T list * Position.T -> term
-  val standard_parse_typ: Proof.context -> syntax ->
+  val standard_parse_term: (term -> string option) ->
+    Proof.context -> type_context -> term_context -> syntax ->
+    string -> Symbol_Pos.T list * Position.T -> term
+  val standard_parse_typ: Proof.context -> type_context -> syntax ->
     ((indexname * sort) list -> indexname -> sort) -> Symbol_Pos.T list * Position.T -> typ
-  val standard_parse_sort: Proof.context -> syntax -> Symbol_Pos.T list * Position.T -> sort
+  val standard_parse_sort: Proof.context -> type_context -> syntax ->
+    Symbol_Pos.T list * Position.T -> sort
   datatype 'a trrule =
-    ParseRule of 'a * 'a |
-    PrintRule of 'a * 'a |
-    ParsePrintRule of 'a * 'a
+    Parse_Rule of 'a * 'a |
+    Print_Rule of 'a * 'a |
+    Parse_Print_Rule of 'a * 'a
   val map_trrule: ('a -> 'b) -> 'a trrule -> 'b trrule
   val is_const: syntax -> string -> bool
+  val read_rule_pattern: Proof.context -> type_context -> syntax -> string * string -> ast
   val standard_unparse_term: {structs: string list, fixes: string list} ->
     {extern_class: string -> xstring, extern_type: string -> xstring,
       extern_const: string -> xstring} -> Proof.context -> syntax -> bool -> term -> Pretty.T
@@ -149,10 +152,8 @@
   val update_type_gram: bool -> mode -> (string * typ * mixfix) list -> syntax -> syntax
   val update_const_gram: bool -> (string -> bool) ->
     mode -> (string * typ * mixfix) list -> syntax -> syntax
-  val update_trrules: Proof.context -> syntax -> (string * string) trrule list -> syntax -> syntax
-  val remove_trrules: Proof.context -> syntax -> (string * string) trrule list -> syntax -> syntax
-  val update_trrules_i: ast trrule list -> syntax -> syntax
-  val remove_trrules_i: ast trrule list -> syntax -> syntax
+  val update_trrules: ast trrule list -> syntax -> syntax
+  val remove_trrules: ast trrule list -> syntax -> syntax
 end;
 
 structure Syntax: SYNTAX =
@@ -619,8 +620,8 @@
 val basic_nonterms =
   (Lexicon.terminals @ [Syn_Ext.logic, "type", "types", "sort", "classes",
     Syn_Ext.args, Syn_Ext.cargs, "pttrn", "pttrns", "idt", "idts", "aprop",
-    "asms", Syn_Ext.any, Syn_Ext.sprop, "num_const", "float_const",
-    "index", "struct", "id_position", "longid_position"]);
+    "asms", Syn_Ext.any, Syn_Ext.sprop, "num_const", "float_const", "index",
+    "struct", "id_position", "longid_position", "type_name", "class_name"]);
 
 
 
@@ -711,7 +712,7 @@
 
 fun ambiguity_msg pos = "Parse error: ambiguous syntax" ^ Position.str_of pos;
 
-fun read_asts ctxt (Syntax (tabs, _)) raw root (syms, pos) =
+fun read_asts ctxt type_ctxt (Syntax (tabs, _)) raw root (syms, pos) =
   let
     val {lexicon, gram, parse_ast_trtab, ...} = tabs;
     val toks = Lexicon.tokenize lexicon raw syms;
@@ -725,7 +726,8 @@
 
     val limit = Config.get ctxt ambiguity_limit;
     fun show_pt pt =
-      Pretty.string_of (Ast.pretty_ast (Syn_Trans.parsetree_to_ast ctxt false (K NONE) pt));
+      Pretty.string_of
+        (Ast.pretty_ast (#2 (Syn_Trans.parsetree_to_ast ctxt type_ctxt false (K NONE) pt)));
     val _ =
       if len <= Config.get ctxt ambiguity_level then ()
       else if not (Config.get ctxt ambiguity_enabled) then error (ambiguity_msg pos)
@@ -738,17 +740,18 @@
 
     val constrain_pos = not raw andalso Config.get ctxt positions;
   in
-    some_results (Syn_Trans.parsetree_to_ast ctxt constrain_pos (lookup_tr parse_ast_trtab)) pts
+    some_results
+      (Syn_Trans.parsetree_to_ast ctxt type_ctxt constrain_pos (lookup_tr parse_ast_trtab)) pts
   end;
 
 
 (* read *)
 
-fun read ctxt (syn as Syntax (tabs, _)) root inp =
+fun read ctxt type_ctxt (syn as Syntax (tabs, _)) root inp =
   let val {parse_ruletab, parse_trtab, ...} = tabs in
-    read_asts ctxt syn false root inp
-    |> map (Ast.normalize ctxt (Symtab.lookup_list parse_ruletab))
-    |> some_results (Syn_Trans.ast_to_term ctxt (lookup_tr parse_trtab))
+    read_asts ctxt type_ctxt syn false root inp
+    |> map (apsnd (Ast.normalize ctxt (Symtab.lookup_list parse_ruletab)))
+    |> some_results (apsnd (Syn_Trans.ast_to_term ctxt (lookup_tr parse_trtab)))
   end;
 
 
@@ -790,51 +793,60 @@
             map (show_term o snd) (take limit results)))
       end;
 
-fun standard_parse_term check term_ctxt ctxt syn root (syms, pos) =
-  read ctxt syn root (syms, pos)
+fun standard_parse_term check ctxt type_ctxt term_ctxt syn root (syms, pos) =
+  read ctxt type_ctxt syn root (syms, pos)
   |> map (Type_Ext.decode_term term_ctxt)
   |> disambig ctxt check;
 
 
 (* read types *)
 
-fun standard_parse_typ ctxt syn get_sort (syms, pos) =
-  (case read ctxt syn (Syn_Ext.typ_to_nonterm Syn_Ext.typeT) (syms, pos) of
-    [t] => Type_Ext.typ_of_term (get_sort (Type_Ext.term_sorts t)) t
+fun standard_parse_typ ctxt type_ctxt syn get_sort (syms, pos) =
+  (case read ctxt type_ctxt syn (Syn_Ext.typ_to_nonterm Syn_Ext.typeT) (syms, pos) of
+    [res] =>
+      let val t = report_result ctxt res
+      in Type_Ext.typ_of_term (get_sort (Type_Ext.term_sorts t)) t end
   | _ => error (ambiguity_msg pos));
 
 
 (* read sorts *)
 
-fun standard_parse_sort ctxt syn (syms, pos) =
-  (case read ctxt syn (Syn_Ext.typ_to_nonterm Type_Ext.sortT) (syms, pos) of
-    [t] => Type_Ext.sort_of_term t
+fun standard_parse_sort ctxt type_ctxt syn (syms, pos) =
+  (case read ctxt type_ctxt syn (Syn_Ext.typ_to_nonterm Type_Ext.sortT) (syms, pos) of
+    [res] =>
+      let val t = report_result ctxt res
+      in Type_Ext.sort_of_term t end
   | _ => error (ambiguity_msg pos));
 
 
 
 (** prepare translation rules **)
 
+(* rules *)
+
 datatype 'a trrule =
-  ParseRule of 'a * 'a |
-  PrintRule of 'a * 'a |
-  ParsePrintRule of 'a * 'a;
+  Parse_Rule of 'a * 'a |
+  Print_Rule of 'a * 'a |
+  Parse_Print_Rule of 'a * 'a;
 
-fun map_trrule f (ParseRule (x, y)) = ParseRule (f x, f y)
-  | map_trrule f (PrintRule (x, y)) = PrintRule (f x, f y)
-  | map_trrule f (ParsePrintRule (x, y)) = ParsePrintRule (f x, f y);
+fun map_trrule f (Parse_Rule (x, y)) = Parse_Rule (f x, f y)
+  | map_trrule f (Print_Rule (x, y)) = Print_Rule (f x, f y)
+  | map_trrule f (Parse_Print_Rule (x, y)) = Parse_Print_Rule (f x, f y);
 
-fun parse_rule (ParseRule pats) = SOME pats
-  | parse_rule (PrintRule _) = NONE
-  | parse_rule (ParsePrintRule pats) = SOME pats;
+fun parse_rule (Parse_Rule pats) = SOME pats
+  | parse_rule (Print_Rule _) = NONE
+  | parse_rule (Parse_Print_Rule pats) = SOME pats;
 
-fun print_rule (ParseRule _) = NONE
-  | print_rule (PrintRule pats) = SOME (swap pats)
-  | print_rule (ParsePrintRule pats) = SOME (swap pats);
+fun print_rule (Parse_Rule _) = NONE
+  | print_rule (Print_Rule pats) = SOME (swap pats)
+  | print_rule (Parse_Print_Rule pats) = SOME (swap pats);
 
 
 fun is_const (Syntax ({consts, ...}, _)) c = member (op =) consts c;
 
+
+(* check_rules *)
+
 local
 
 fun check_rule rule =
@@ -844,7 +856,18 @@
         Pretty.string_of (Ast.pretty_rule rule))
   | NONE => rule);
 
-fun read_pattern ctxt syn (root, str) =
+in
+
+fun check_rules rules =
+ (map check_rule (map_filter parse_rule rules),
+  map check_rule (map_filter print_rule rules));
+
+end;
+
+
+(* read_rule_pattern *)
+
+fun read_rule_pattern ctxt type_ctxt syn (root, str) =
   let
     fun constify (ast as Ast.Constant _) = ast
       | constify (ast as Ast.Variable x) =
@@ -854,25 +877,13 @@
 
     val (syms, pos) = read_token str;
   in
-    (case read_asts ctxt syn true root (syms, pos) of
-      [ast] => constify ast
+    (case read_asts ctxt type_ctxt syn true root (syms, pos) of
+      [res] =>
+        let val ast = report_result ctxt res
+        in constify ast end
     | _ => error (ambiguity_msg pos))
   end;
 
-fun prep_rules rd_pat raw_rules =
-  let val rules = map (map_trrule rd_pat) raw_rules in
-    (map check_rule (map_filter parse_rule rules),
-      map check_rule (map_filter print_rule rules))
-  end
-
-in
-
-val cert_rules = prep_rules I;
-
-fun read_rules ctxt syn = prep_rules (read_pattern ctxt syn);
-
-end;
-
 
 
 (** unparse terms, typs, sorts **)
@@ -920,14 +931,8 @@
 fun update_const_gram add is_logtype prmode decls =
   (if add then update_syntax else remove_syntax) prmode (Mixfix.syn_ext_consts is_logtype decls);
 
-fun update_trrules ctxt syn =
-  ext_syntax Syn_Ext.syn_ext_rules o read_rules ctxt syn;
-
-fun remove_trrules ctxt syn =
-  remove_syntax mode_default o Syn_Ext.syn_ext_rules o read_rules ctxt syn;
-
-val update_trrules_i = ext_syntax Syn_Ext.syn_ext_rules o cert_rules;
-val remove_trrules_i = remove_syntax mode_default o Syn_Ext.syn_ext_rules o cert_rules;
+val update_trrules = ext_syntax Syn_Ext.syn_ext_rules o check_rules;
+val remove_trrules = remove_syntax mode_default o Syn_Ext.syn_ext_rules o check_rules;
 
 
 (*export parts of internal Syntax structures*)