src/Pure/Syntax/syntax.ML
changeset 39126 ee117c5b3b75
parent 38831 4933a3dfd745
child 39135 6f5f64542405
--- a/src/Pure/Syntax/syntax.ML	Fri Sep 03 21:13:53 2010 +0200
+++ b/src/Pure/Syntax/syntax.ML	Fri Sep 03 22:36:16 2010 +0200
@@ -36,9 +36,10 @@
   val print_syntax: syntax -> unit
   val guess_infix: syntax -> string -> mixfix option
   val read_token: string -> Symbol_Pos.T list * Position.T
-  val ambiguity_is_error: bool Unsynchronized.ref
-  val ambiguity_level: int Unsynchronized.ref
-  val ambiguity_limit: int Unsynchronized.ref
+  val ambiguity_enabled: bool Config.T
+  val ambiguity_level_value: Config.value Config.T
+  val ambiguity_level: int Config.T
+  val ambiguity_limit: int Config.T
   val standard_parse_term: Pretty.pp -> (term -> string option) ->
     (((string * int) * sort) list -> string * int -> Term.sort) ->
     (string -> bool * string) -> (string -> string option) -> Proof.context ->
@@ -472,9 +473,14 @@
 
 (* read_ast *)
 
-val ambiguity_is_error = Unsynchronized.ref false;
-val ambiguity_level = Unsynchronized.ref 1;
-val ambiguity_limit = Unsynchronized.ref 10;
+val ambiguity_enabled =
+  Config.bool (Config.declare "syntax_ambiguity_enabled" (fn _ => Config.Bool true));
+
+val ambiguity_level_value = Config.declare "syntax_ambiguity_level" (fn _ => Config.Int 1);
+val ambiguity_level = Config.int ambiguity_level_value;
+
+val ambiguity_limit =
+  Config.int (Config.declare "syntax_ambiguity_limit" (fn _ => Config.Int 10));
 
 fun ambiguity_msg pos = "Parse error: ambiguous syntax" ^ Position.str_of pos;
 
@@ -488,12 +494,12 @@
     val pts = Parser.parse ctxt gram root' (filter Lexicon.is_proper toks);
     val len = length pts;
 
-    val limit = ! ambiguity_limit;
+    val limit = Config.get ctxt ambiguity_limit;
     fun show_pt pt =
       Pretty.string_of (Ast.pretty_ast (hd (Syn_Trans.pts_to_asts ctxt (K NONE) [pt])));
   in
-    if len <= ! ambiguity_level then ()
-    else if ! ambiguity_is_error then error (ambiguity_msg pos)
+    if len <= Config.get ctxt ambiguity_level then ()
+    else if not (Config.get ctxt ambiguity_enabled) then error (ambiguity_msg pos)
     else
       (Context_Position.if_visible ctxt warning (cat_lines
         (("Ambiguous input" ^ Position.str_of pos ^
@@ -522,14 +528,14 @@
 fun disambig _ _ _ [t] = t
   | disambig ctxt pp check ts =
       let
-        val level = ! ambiguity_level;
-        val limit = ! ambiguity_limit;
+        val level = Config.get ctxt ambiguity_level;
+        val limit = Config.get ctxt ambiguity_limit;
 
         val ambiguity = length ts;
         fun ambig_msg () =
           if ambiguity > 1 andalso ambiguity <= level then
             "Got more than one parse tree.\n\
-            \Retry with smaller Syntax.ambiguity_level for more information."
+            \Retry with smaller syntax_ambiguity_level for more information."
           else "";
 
         val errs = Par_List.map check ts;