author | wenzelm |
Sun, 01 Jun 2025 16:43:09 +0200 | |
changeset 82679 | 1dd29afaddda |
parent 68844 | 63c9c6ceb7a3 |
permissions | -rw-r--r-- |
68839 | 1 |
(* Title: Pure/Thy/thy_element.ML |
23726 | 2 |
Author: Makarius |
3 |
||
68839 | 4 |
Theory elements: statements with optional proof. |
23726 | 5 |
*) |
6 |
||
68839 | 7 |
signature THY_ELEMENT = |
23726 | 8 |
sig |
51225 | 9 |
datatype 'a element = Element of 'a * ('a element list * 'a) option |
51321 | 10 |
val atom: 'a -> 'a element |
51225 | 11 |
val map_element: ('a -> 'b) -> 'a element -> 'b element |
12 |
val flat_element: 'a element -> 'a list |
|
51268
fcc4b89a600d
simplified Outer_Syntax.read_span: internalized Toplevel.is_ignored;
wenzelm
parents:
51267
diff
changeset
|
13 |
val last_element: 'a element -> 'a |
82679 | 14 |
val parse_elements_generic: Keyword.keywords -> ('a -> Command_Span.span) -> 'a Scan.stopper -> |
15 |
'a list -> 'a element list |
|
58923 | 16 |
val parse_elements: Keyword.keywords -> Command_Span.span list -> Command_Span.span element list |
23726 | 17 |
end; |
18 |
||
68839 | 19 |
structure Thy_Element: THY_ELEMENT = |
23726 | 20 |
struct |
21 |
||
61379
c57820ceead3
more direct HTML presentation, without print mode;
wenzelm
parents:
59809
diff
changeset
|
22 |
(* datatype element: command with optional proof *) |
43621 | 23 |
|
51225 | 24 |
datatype 'a element = Element of 'a * ('a element list * 'a) option; |
25 |
||
26 |
fun element (a, b) = Element (a, SOME b); |
|
27 |
fun atom a = Element (a, NONE); |
|
43621 | 28 |
|
51225 | 29 |
fun map_element f (Element (a, NONE)) = Element (f a, NONE) |
30 |
| map_element f (Element (a, SOME (elems, b))) = |
|
31 |
Element (f a, SOME ((map o map_element) f elems, f b)); |
|
32 |
||
33 |
fun flat_element (Element (a, NONE)) = [a] |
|
34 |
| flat_element (Element (a, SOME (elems, b))) = a :: maps flat_element elems @ [b]; |
|
43621 | 35 |
|
51268
fcc4b89a600d
simplified Outer_Syntax.read_span: internalized Toplevel.is_ignored;
wenzelm
parents:
51267
diff
changeset
|
36 |
fun last_element (Element (a, NONE)) = a |
fcc4b89a600d
simplified Outer_Syntax.read_span: internalized Toplevel.is_ignored;
wenzelm
parents:
51267
diff
changeset
|
37 |
| last_element (Element (_, SOME (_, b))) = b; |
fcc4b89a600d
simplified Outer_Syntax.read_span: internalized Toplevel.is_ignored;
wenzelm
parents:
51267
diff
changeset
|
38 |
|
28434 | 39 |
|
40 |
||
46811
03a2dc9e0624
clarified command span: include trailing whitespace/comments and thus reduce number of ignored spans with associated transactions and states (factor 2);
wenzelm
parents:
45666
diff
changeset
|
41 |
(* parse *) |
28434 | 42 |
|
82679 | 43 |
fun parse_elements_generic keywords get_span stopper = |
44 |
let |
|
45 |
val not_eof = not o Scan.is_stopper stopper; |
|
28434 | 46 |
|
68842 | 47 |
fun category pred other = |
82679 | 48 |
Scan.one (fn x => |
49 |
(case get_span x of |
|
50 |
Command_Span.Span (Command_Span.Command_Span (name, _), _) => pred keywords name |
|
51 |
| _ => other)); |
|
68842 | 52 |
|
68843 | 53 |
fun theory_element x = |
68844 | 54 |
(category Keyword.is_theory_goal false -- proof >> element) x |
68843 | 55 |
and proof_element x = |
68844 | 56 |
(category Keyword.is_proof_goal false -- proof >> element || |
68842 | 57 |
category Keyword.is_proof_body true >> atom) x |
68844 | 58 |
and proof x = (Scan.repeat proof_element -- category Keyword.is_qed false) x; |
68843 | 59 |
|
68844 | 60 |
val default_element = Scan.one not_eof >> atom; |
28434 | 61 |
|
82679 | 62 |
val parse_element = theory_element || default_element |
63 |
in |
|
64 |
Source.of_list #> |
|
65 |
Source.source stopper (Scan.bulk parse_element) #> |
|
66 |
Source.exhaust |
|
67 |
end; |
|
28434 | 68 |
|
58923 | 69 |
fun parse_elements keywords = |
82679 | 70 |
parse_elements_generic keywords I Command_Span.stopper; |
28434 | 71 |
|
23726 | 72 |
end; |