src/Pure/Syntax/term_position.ML
author wenzelm
Wed, 09 Nov 2011 20:47:11 +0100
changeset 45429 fd58cbf8cae3
parent 42264 b6c1b0c4c511
child 45445 41e641a870de
permissions -rw-r--r--
tuned signature; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42264
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Syntax/term_position.ML
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     3
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     4
Encoded position within term syntax trees.
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     5
*)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     6
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     7
signature TERM_POSITION =
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     8
sig
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
     9
  val pretty: Position.T -> Pretty.T
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    10
  val encode: Position.T -> string
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    11
  val decode: string -> Position.T option
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    12
  val decode_position: term -> Position.T option
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    13
  val is_position: term -> bool
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    14
  val strip_positions: term -> term
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    15
end;
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    16
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    17
structure Term_Position: TERM_POSITION =
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    18
struct
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    19
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    20
(* markup *)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    21
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    22
val position_dummy = "<position>";
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    23
val position_text = XML.Text position_dummy;
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    24
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    25
fun pretty pos =
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    26
  Pretty.markup (Position.markup pos Markup.position) [Pretty.str position_dummy];
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    27
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    28
fun encode pos =
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    29
  YXML.string_of (XML.Elem (Position.markup pos Markup.position, [position_text]));
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    30
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    31
fun decode str =
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    32
  (case YXML.parse_body str handle Fail msg => error msg of
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    33
    [XML.Elem ((name, props), [arg])] =>
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    34
      if name = Markup.positionN andalso arg = position_text
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    35
      then SOME (Position.of_properties props)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    36
      else NONE
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    37
  | _ => NONE);
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    38
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    39
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    40
(* positions within parse trees *)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    41
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    42
fun decode_position (Free (x, _)) = decode x
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    43
  | decode_position _ = NONE;
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    44
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    45
val is_position = is_some o decode_position;
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    46
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    47
fun strip_positions ((t as Const (c, _)) $ u $ v) =
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    48
      if (c = "_constrain" orelse c = "_constrainAbs") andalso is_position v
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    49
      then strip_positions u
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    50
      else t $ strip_positions u $ strip_positions v
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    51
  | strip_positions (t $ u) = strip_positions t $ strip_positions u
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    52
  | strip_positions (Abs (x, T, t)) = Abs (x, T, strip_positions t)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    53
  | strip_positions t = t;
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    54
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents:
diff changeset
    55
end;