src/Pure/PIDE/markup_kind.ML
author wenzelm
Sun, 29 Sep 2024 21:16:17 +0200
changeset 81008 d0cd220d8e8b
parent 80941 fd7a70babec1
child 81118 9e2eb05cc2b7
permissions -rw-r--r--
more markup reports: notably "notation=..." within pretty blocks;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80919
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
     1
(*  Title:      Pure/markup_kind.ML
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
     3
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
     4
Formally defined kind for Markup.notation and Markup.expression.
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
     5
*)
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
     6
80919
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
     7
signature MARKUP_KIND =
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
     8
sig
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
     9
  val get_notation_kinds: Proof.context -> string list
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    10
  val check_notation_kind: Proof.context -> xstring * Position.T -> string
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    11
  val setup_notation_kind: binding -> theory -> string * theory
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    12
  val check_notation: Proof.context -> xstring * Position.T -> Markup.T
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    13
  val setup_notation: binding -> Markup.T
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    14
  val get_expression_kinds: Proof.context -> string list
80919
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    15
  val check_expression_kind: Proof.context -> xstring * Position.T -> string
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    16
  val setup_expression_kind: binding -> theory -> string * theory
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    17
  val check_expression: Proof.context -> xstring * Position.T -> Markup.T
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    18
  val setup_expression: binding -> Markup.T
80941
fd7a70babec1 more markup <expression kind="item"> in Isabelle/Scala, with pro-forma Markup_Kind.setup in Isabelle/ML;
wenzelm
parents: 80923
diff changeset
    19
  val markup_item: Markup.T
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    20
  val markup_mixfix: Markup.T
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    21
  val markup_prefix: Markup.T
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    22
  val markup_postfix: Markup.T
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    23
  val markup_infix: Markup.T
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    24
  val markup_binder: Markup.T
80912
b2eaa342aae5 support more markup elements;
wenzelm
parents: 80902
diff changeset
    25
  val markup_type_application: Markup.T
80921
a37ed1aeb163 clarified inner syntax markup: use "notation" uniformly;
wenzelm
parents: 80920
diff changeset
    26
  val markup_application: Markup.T
a37ed1aeb163 clarified inner syntax markup: use "notation" uniformly;
wenzelm
parents: 80920
diff changeset
    27
  val markup_abstraction: Markup.T
80923
6c9628a116cc more specific markup for "judgment";
wenzelm
parents: 80921
diff changeset
    28
  val markup_judgment: Markup.T
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    29
end;
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    30
80919
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    31
structure Markup_Kind: MARKUP_KIND =
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    32
struct
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    33
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    34
(* theory data *)
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    35
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    36
structure Data = Theory_Data
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    37
(
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    38
  type T = unit Name_Space.table * unit Name_Space.table;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    39
  val empty : T =
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    40
   (Name_Space.empty_table "markup_notation_kind",
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    41
    Name_Space.empty_table "markup_expression_kind");
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    42
  fun merge ((tab1, tab2), (tab1', tab2')) : T =
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    43
   (Name_Space.merge_tables (tab1, tab1'),
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    44
    Name_Space.merge_tables (tab2, tab2'));
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    45
);
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    46
80902
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    47
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    48
(* kind *)
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    49
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    50
local
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    51
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    52
fun get_kinds which ctxt =
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    53
  which (Data.get (Proof_Context.theory_of ctxt))
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    54
  |> Name_Space.dest_table
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    55
  |> map #1
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    56
  |> sort_strings;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    57
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    58
fun check_kind which ctxt =
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    59
  Name_Space.check (Context.Proof ctxt) (which (Data.get (Proof_Context.theory_of ctxt))) #> #1;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    60
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    61
fun setup_kind which ap binding thy =
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    62
  let
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    63
    val context = Name_Space.map_naming (K Name_Space.global_naming) (Context.Theory thy);
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    64
    val (name, tab') = Name_Space.define context true (binding, ()) (which (Data.get thy));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    65
  in (name, (Data.map o ap) (K tab') thy) end;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    66
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    67
in
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    68
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    69
val get_notation_kinds = get_kinds #1;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    70
val get_expression_kinds = get_kinds #2;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    71
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    72
val check_notation_kind = check_kind #1;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    73
val check_expression_kind = check_kind #2;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    74
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    75
val setup_notation_kind = setup_kind #1 apfst;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    76
val setup_expression_kind = setup_kind #2 apsnd;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    77
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    78
end;
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    79
80902
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    80
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    81
(* markup *)
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    82
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    83
fun check_notation ctxt = check_notation_kind ctxt #> Markup.notation;
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    84
80919
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    85
fun check_expression ctxt = check_expression_kind ctxt #> Markup.expression;
80902
ac1e8686e523 more operations;
wenzelm
parents: 80889
diff changeset
    86
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    87
fun setup_notation binding =
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    88
  Context.>>> (Context.map_theory_result (setup_notation_kind binding #>> Markup.notation));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    89
80919
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    90
fun setup_expression binding =
1a52cc1c3274 clarified modules and signature;
wenzelm
parents: 80915
diff changeset
    91
  Context.>>> (Context.map_theory_result (setup_expression_kind binding #>> Markup.expression));
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
    92
80912
b2eaa342aae5 support more markup elements;
wenzelm
parents: 80902
diff changeset
    93
b2eaa342aae5 support more markup elements;
wenzelm
parents: 80902
diff changeset
    94
(* concrete markup *)
b2eaa342aae5 support more markup elements;
wenzelm
parents: 80902
diff changeset
    95
80941
fd7a70babec1 more markup <expression kind="item"> in Isabelle/Scala, with pro-forma Markup_Kind.setup in Isabelle/ML;
wenzelm
parents: 80923
diff changeset
    96
val markup_item = setup_expression (Binding.make ("item", \<^here>));
fd7a70babec1 more markup <expression kind="item"> in Isabelle/Scala, with pro-forma Markup_Kind.setup in Isabelle/ML;
wenzelm
parents: 80923
diff changeset
    97
80920
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    98
val markup_mixfix = setup_notation (Binding.make ("mixfix", \<^here>));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
    99
val markup_prefix = setup_notation (Binding.make ("prefix", \<^here>));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
   100
val markup_postfix = setup_notation (Binding.make ("postfix", \<^here>));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
   101
val markup_infix = setup_notation (Binding.make ("infix", \<^here>));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
   102
val markup_binder = setup_notation (Binding.make ("binder", \<^here>));
bbe2c56fe255 more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents: 80919
diff changeset
   103
80921
a37ed1aeb163 clarified inner syntax markup: use "notation" uniformly;
wenzelm
parents: 80920
diff changeset
   104
val markup_type_application = setup_notation (Binding.make ("type_application", \<^here>));
a37ed1aeb163 clarified inner syntax markup: use "notation" uniformly;
wenzelm
parents: 80920
diff changeset
   105
val markup_application = setup_notation (Binding.make ("application", \<^here>));
a37ed1aeb163 clarified inner syntax markup: use "notation" uniformly;
wenzelm
parents: 80920
diff changeset
   106
val markup_abstraction = setup_notation (Binding.make ("abstraction", \<^here>));
80912
b2eaa342aae5 support more markup elements;
wenzelm
parents: 80902
diff changeset
   107
80923
6c9628a116cc more specific markup for "judgment";
wenzelm
parents: 80921
diff changeset
   108
val markup_judgment = setup_notation (Binding.make ("judgment", \<^here>));
6c9628a116cc more specific markup for "judgment";
wenzelm
parents: 80921
diff changeset
   109
80889
510f6cb6721e more formal Markup.expression;
wenzelm
parents:
diff changeset
   110
end;