363 fun parse_failed ctxt pos msg kind = |
363 fun parse_failed ctxt pos msg kind = |
364 cat_error msg ("Failed to parse " ^ kind ^ |
364 cat_error msg ("Failed to parse " ^ kind ^ |
365 Markup.markup_report (Context_Position.reported_text ctxt pos Markup.bad "")); |
365 Markup.markup_report (Context_Position.reported_text ctxt pos Markup.bad "")); |
366 |
366 |
367 fun parse_sort ctxt = |
367 fun parse_sort ctxt = |
368 Syntax.parse_token ctxt Term_XML.Decode.sort Markup.language_sort |
368 Syntax.parse_input ctxt Term_XML.Decode.sort Markup.language_sort |
369 (fn (syms, pos) => |
369 (fn (syms, pos) => |
370 parse_tree ctxt "sort" (syms, pos) |
370 parse_tree ctxt "sort" (syms, pos) |
371 |> uncurry (report_result ctxt pos) |
371 |> uncurry (report_result ctxt pos) |
372 |> decode_sort |
372 |> decode_sort |
373 |> Type.minimize_sort (Proof_Context.tsig_of ctxt) |
373 |> Type.minimize_sort (Proof_Context.tsig_of ctxt) |
374 handle ERROR msg => parse_failed ctxt pos msg "sort"); |
374 handle ERROR msg => parse_failed ctxt pos msg "sort"); |
375 |
375 |
376 fun parse_typ ctxt = |
376 fun parse_typ ctxt = |
377 Syntax.parse_token ctxt Term_XML.Decode.typ Markup.language_type |
377 Syntax.parse_input ctxt Term_XML.Decode.typ Markup.language_type |
378 (fn (syms, pos) => |
378 (fn (syms, pos) => |
379 parse_tree ctxt "type" (syms, pos) |
379 parse_tree ctxt "type" (syms, pos) |
380 |> uncurry (report_result ctxt pos) |
380 |> uncurry (report_result ctxt pos) |
381 |> decode_typ |
381 |> decode_typ |
382 handle ERROR msg => parse_failed ctxt pos msg "type"); |
382 handle ERROR msg => parse_failed ctxt pos msg "type"); |
387 if is_prop |
387 if is_prop |
388 then (Markup.language_prop, "prop", "prop", Type.constraint propT) |
388 then (Markup.language_prop, "prop", "prop", Type.constraint propT) |
389 else (Markup.language_term, "term", Config.get ctxt Syntax.root, I); |
389 else (Markup.language_term, "term", Config.get ctxt Syntax.root, I); |
390 val decode = constrain o Term_XML.Decode.term; |
390 val decode = constrain o Term_XML.Decode.term; |
391 in |
391 in |
392 Syntax.parse_token ctxt decode markup |
392 Syntax.parse_input ctxt decode markup |
393 (fn (syms, pos) => |
393 (fn (syms, pos) => |
394 let |
394 let |
395 val (ambig_msgs, results) = parse_tree ctxt root (syms, pos) ||> map (decode_term ctxt); |
395 val (ambig_msgs, results) = parse_tree ctxt root (syms, pos) ||> map (decode_term ctxt); |
396 val parsed_len = length (proper_results results); |
396 val parsed_len = length (proper_results results); |
397 |
397 |
461 SOME p => Ast.mk_appl (decode (p :: ps) ast) (map (decode ps) args) |
461 SOME p => Ast.mk_appl (decode (p :: ps) ast) (map (decode ps) args) |
462 | NONE => decode_appl ps asts) |
462 | NONE => decode_appl ps asts) |
463 else decode_appl ps asts |
463 else decode_appl ps asts |
464 | decode ps (Ast.Appl asts) = decode_appl ps asts; |
464 | decode ps (Ast.Appl asts) = decode_appl ps asts; |
465 |
465 |
466 val source = Syntax.read_token str; |
466 val source = Syntax.read_input str; |
467 val pos = Input.pos_of source; |
467 val pos = Input.pos_of source; |
468 val syms = Input.source_explode source; |
468 val syms = Input.source_explode source; |
469 val ast = |
469 val ast = |
470 parse_asts ctxt true root (syms, pos) |
470 parse_asts ctxt true root (syms, pos) |
471 |> uncurry (report_result ctxt pos) |
471 |> uncurry (report_result ctxt pos) |