src/Pure/Syntax/syntax_phases.ML
changeset 42281 69d4543811d0
parent 42267 9566078ad905
child 42282 4fa41e068ff0
equal deleted inserted replaced
42280:e7f3652c280c 42281:69d4543811d0
   300       |> report_result ctxt pos
   300       |> report_result ctxt pos
   301       |> (fn t => typ_of_term (ProofContext.get_sort ctxt (term_sorts t)) t)
   301       |> (fn t => typ_of_term (ProofContext.get_sort ctxt (term_sorts t)) t)
   302       handle ERROR msg => parse_failed ctxt pos msg "type";
   302       handle ERROR msg => parse_failed ctxt pos msg "type";
   303   in T end;
   303   in T end;
   304 
   304 
   305 fun parse_term T ctxt text =
   305 fun parse_term is_prop ctxt text =
   306   let
   306   let
   307     val (T', _) = Type_Infer.paramify_dummies T 0;
   307     val (markup, kind, root, constrain) =
   308     val (markup, kind) =
   308       if is_prop
   309       if T' = propT then (Markup.prop, "proposition") else (Markup.term, "term");
   309       then (Markup.prop, "proposition", "prop", Type.constraint propT)
       
   310       else (Markup.term, "term", Config.get ctxt Syntax.default_root, I);
   310     val (syms, pos) = Syntax.parse_token ctxt markup text;
   311     val (syms, pos) = Syntax.parse_token ctxt markup text;
   311 
       
   312     val default_root = Config.get ctxt Syntax.default_root;
       
   313     val root =
       
   314       (case T' of
       
   315         Type (c, _) =>
       
   316           if c <> "prop" andalso Type.is_logtype (ProofContext.tsig_of ctxt) c
       
   317           then default_root else c
       
   318       | _ => default_root);
       
   319   in
   312   in
   320     let
   313     let
   321       val results = parse_raw ctxt root (syms, pos) |> map (decode_term ctxt);
   314       val results = parse_raw ctxt root (syms, pos) |> map (decode_term ctxt);
   322       val ambiguity = length (proper_results results);
   315       val ambiguity = length (proper_results results);
   323 
   316 
   329           "Got more than one parse tree.\n\
   322           "Got more than one parse tree.\n\
   330           \Retry with smaller syntax_ambiguity_level for more information."
   323           \Retry with smaller syntax_ambiguity_level for more information."
   331         else "";
   324         else "";
   332 
   325 
   333       (*brute-force disambiguation via type-inference*)
   326       (*brute-force disambiguation via type-inference*)
   334       fun check t = (Syntax.check_term ctxt (Type.constraint T' t); Exn.Result t)
   327       fun check t = (Syntax.check_term ctxt (constrain t); Exn.Result t)
   335         handle exn as ERROR _ => Exn.Exn exn;
   328         handle exn as ERROR _ => Exn.Exn exn;
   336 
   329 
   337       val results' =
   330       val results' =
   338         if ambiguity > 1 then
   331         if ambiguity > 1 then
   339           (Par_List.map_name "Syntax_Phases.parse_term" o apsnd o Exn.maps_result)
   332           (Par_List.map_name "Syntax_Phases.parse_term" o apsnd o Exn.maps_result)
   657 (** install operations **)
   650 (** install operations **)
   658 
   651 
   659 val _ = Syntax.install_operations
   652 val _ = Syntax.install_operations
   660   {parse_sort = parse_sort,
   653   {parse_sort = parse_sort,
   661    parse_typ = parse_typ,
   654    parse_typ = parse_typ,
   662    parse_term = parse_term dummyT,
   655    parse_term = parse_term false,
   663    parse_prop = parse_term propT,
   656    parse_prop = parse_term true,
   664    unparse_sort = unparse_sort,
   657    unparse_sort = unparse_sort,
   665    unparse_typ = unparse_typ,
   658    unparse_typ = unparse_typ,
   666    unparse_term = unparse_term};
   659    unparse_term = unparse_term};
   667 
   660 
   668 end;
   661 end;