| author | desharna | 
| Mon, 01 Sep 2014 13:23:05 +0200 | |
| changeset 58103 | c23bdb4ed2f6 | 
| parent 52175 | 626a757d3c2d | 
| child 80873 | e71cb37c7395 | 
| permissions | -rw-r--r-- | 
| 42264 | 1 | (* Title: Pure/Syntax/term_position.ML | 
| 2 | Author: Makarius | |
| 3 | ||
| 4 | Encoded position within term syntax trees. | |
| 5 | *) | |
| 6 | ||
| 7 | signature TERM_POSITION = | |
| 8 | sig | |
| 9 | val pretty: Position.T -> Pretty.T | |
| 10 | val encode: Position.T -> string | |
| 11 | val decode: string -> Position.T option | |
| 45445 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 12 | val decode_position: term -> (Position.T * typ) option | 
| 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 13 | val decode_positionT: typ -> Position.T option | 
| 49685 
4341e4d86872
allow position constraints to coexist with 0 or 1 sort constraints;
 wenzelm parents: 
49674diff
changeset | 14 | val decode_positionS: sort -> Position.T list * sort | 
| 42264 | 15 | val is_position: term -> bool | 
| 45448 
018f8959c7a6
more efficient prepare_sorts -- bypass encoded positions;
 wenzelm parents: 
45445diff
changeset | 16 | val is_positionT: typ -> bool | 
| 52175 
626a757d3c2d
uniform Term_Position.markers (cf. dbadb4d03cbc);
 wenzelm parents: 
50201diff
changeset | 17 | val markers: string list | 
| 42264 | 18 | val strip_positions: term -> term | 
| 19 | end; | |
| 20 | ||
| 21 | structure Term_Position: TERM_POSITION = | |
| 22 | struct | |
| 23 | ||
| 24 | (* markup *) | |
| 25 | ||
| 26 | val position_dummy = "<position>"; | |
| 27 | val position_text = XML.Text position_dummy; | |
| 28 | ||
| 29 | fun pretty pos = | |
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49685diff
changeset | 30 | Pretty.markup (Position.markup pos Markup.position) [Pretty.str position_dummy]; | 
| 42264 | 31 | |
| 32 | fun encode pos = | |
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49685diff
changeset | 33 | YXML.string_of (XML.Elem (Position.markup pos Markup.position, [position_text])); | 
| 42264 | 34 | |
| 35 | fun decode str = | |
| 36 | (case YXML.parse_body str handle Fail msg => error msg of | |
| 37 | [XML.Elem ((name, props), [arg])] => | |
| 50201 
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
 wenzelm parents: 
49685diff
changeset | 38 | if name = Markup.positionN andalso arg = position_text | 
| 42264 | 39 | then SOME (Position.of_properties props) | 
| 40 | else NONE | |
| 41 | | _ => NONE); | |
| 42 | ||
| 43 | ||
| 44 | (* positions within parse trees *) | |
| 45 | ||
| 45445 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 46 | fun decode_position (Free (x, _)) = | 
| 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 47 | (case decode x of | 
| 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 48 | SOME pos => SOME (pos, TFree (x, dummyS)) | 
| 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 49 | | NONE => NONE) | 
| 42264 | 50 | | decode_position _ = NONE; | 
| 51 | ||
| 45445 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 52 | fun decode_positionT (TFree (x, _)) = decode x | 
| 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 53 | | decode_positionT _ = NONE; | 
| 
41e641a870de
pass term positions into check phase, where resulting types are reported accordingly, and eventually shown as tooltips;
 wenzelm parents: 
42264diff
changeset | 54 | |
| 49685 
4341e4d86872
allow position constraints to coexist with 0 or 1 sort constraints;
 wenzelm parents: 
49674diff
changeset | 55 | fun decode_positionS cs = | 
| 
4341e4d86872
allow position constraints to coexist with 0 or 1 sort constraints;
 wenzelm parents: 
49674diff
changeset | 56 | let val (ps, sort) = List.partition (is_some o decode) cs | 
| 
4341e4d86872
allow position constraints to coexist with 0 or 1 sort constraints;
 wenzelm parents: 
49674diff
changeset | 57 | in (map (the o decode) ps, sort) end; | 
| 49674 
dbadb4d03cbc
report sort assignment of visible type variables;
 wenzelm parents: 
45666diff
changeset | 58 | |
| 42264 | 59 | val is_position = is_some o decode_position; | 
| 45448 
018f8959c7a6
more efficient prepare_sorts -- bypass encoded positions;
 wenzelm parents: 
45445diff
changeset | 60 | val is_positionT = is_some o decode_positionT; | 
| 42264 | 61 | |
| 52175 
626a757d3c2d
uniform Term_Position.markers (cf. dbadb4d03cbc);
 wenzelm parents: 
50201diff
changeset | 62 | val markers = ["_constrain", "_constrainAbs", "_ofsort"]; | 
| 
626a757d3c2d
uniform Term_Position.markers (cf. dbadb4d03cbc);
 wenzelm parents: 
50201diff
changeset | 63 | |
| 42264 | 64 | fun strip_positions ((t as Const (c, _)) $ u $ v) = | 
| 52175 
626a757d3c2d
uniform Term_Position.markers (cf. dbadb4d03cbc);
 wenzelm parents: 
50201diff
changeset | 65 | if member (op =) markers c andalso is_position v | 
| 42264 | 66 | then strip_positions u | 
| 67 | else t $ strip_positions u $ strip_positions v | |
| 68 | | strip_positions (t $ u) = strip_positions t $ strip_positions u | |
| 69 | | strip_positions (Abs (x, T, t)) = Abs (x, T, strip_positions t) | |
| 70 | | strip_positions t = t; | |
| 71 | ||
| 72 | end; |