| author | wenzelm |
| Sun, 29 Sep 2024 21:16:17 +0200 | |
| changeset 81008 | d0cd220d8e8b |
| parent 80941 | fd7a70babec1 |
| child 81118 | 9e2eb05cc2b7 |
| permissions | -rw-r--r-- |
| 80919 | 1 |
(* Title: Pure/markup_kind.ML |
| 80889 | 2 |
Author: Makarius |
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 | 5 |
*) |
6 |
||
| 80919 | 7 |
signature MARKUP_KIND = |
| 80889 | 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 | 15 |
val check_expression_kind: Proof.context -> xstring * Position.T -> string |
16 |
val setup_expression_kind: binding -> theory -> string * theory |
|
17 |
val check_expression: Proof.context -> xstring * Position.T -> Markup.T |
|
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 | 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 | 28 |
val markup_judgment: Markup.T |
| 80889 | 29 |
end; |
30 |
||
| 80919 | 31 |
structure Markup_Kind: MARKUP_KIND = |
| 80889 | 32 |
struct |
33 |
||
34 |
(* theory data *) |
|
35 |
||
36 |
structure Data = Theory_Data |
|
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 | 45 |
); |
46 |
||
| 80902 | 47 |
|
48 |
(* kind *) |
|
49 |
||
|
80920
bbe2c56fe255
more uniform treatment of Markup.notation and Markup.expression: manage kinds via context;
wenzelm
parents:
80919
diff
changeset
|
50 |
local |
| 80889 | 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 | 62 |
let |
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 | 79 |
|
| 80902 | 80 |
|
81 |
(* markup *) |
|
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 | 85 |
fun check_expression ctxt = check_expression_kind ctxt #> Markup.expression; |
| 80902 | 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 | 90 |
fun setup_expression binding = |
91 |
Context.>>> (Context.map_theory_result (setup_expression_kind binding #>> Markup.expression)); |
|
| 80889 | 92 |
|
| 80912 | 93 |
|
94 |
(* concrete markup *) |
|
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 | 107 |
|
| 80923 | 108 |
val markup_judgment = setup_notation (Binding.make ("judgment", \<^here>));
|
109 |
||
| 80889 | 110 |
end; |