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; |