author | Christian Urban <urbanc@in.tum.de> |
Thu, 20 Aug 2009 22:30:20 +0200 | |
changeset 316 | 74f0a06f751f |
parent 315 | de49d5780f57 |
child 319 | 6bce4acf7f2a |
permissions | -rw-r--r-- |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1 |
theory Parsing |
121 | 2 |
imports Base "Package/Simple_Inductive_Package" |
310
007922777ff1
added some rudimentary inrastructure for producing the ML-code
Christian Urban <urbanc@in.tum.de>
parents:
299
diff
changeset
|
3 |
uses "Parsing.ML" |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
4 |
begin |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
5 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
6 |
chapter {* Parsing *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
7 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
8 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
9 |
|
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
10 |
Isabelle distinguishes between \emph{outer} and \emph{inner} syntax. |
236 | 11 |
Commands, such as \isacommand{definition}, \isacommand{inductive} and so |
12 |
on, belong to the outer syntax, whereas terms, types and so on belong to the |
|
13 |
inner syntax. For parsing inner syntax, |
|
156 | 14 |
Isabelle uses a rather general and sophisticated algorithm, which |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
15 |
is driven by priority grammars. Parsers for outer syntax are built up by functional |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
16 |
parsing combinators. These combinators are a well-established technique for parsing, |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
17 |
which has, for example, been described in Paulson's classic ML-book \cite{paulson-ml2}. |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
18 |
Isabelle developers are usually concerned with writing these outer syntax parsers, |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
19 |
either for new definitional packages or for calling methods with specific arguments. |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
20 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
21 |
\begin{readmore} |
236 | 22 |
The library for writing parser combinators is split up, roughly, into two |
23 |
parts. The first part consists of a collection of generic parser combinators |
|
24 |
defined in the structure @{ML_struct Scan} in the file @{ML_file |
|
25 |
"Pure/General/scan.ML"}. The second part of the library consists of |
|
26 |
combinators for dealing with specific token types, which are defined in the |
|
27 |
structure @{ML_struct OuterParse} in the file @{ML_file |
|
28 |
"Pure/Isar/outer_parse.ML"}. Specific parsers for packages are defined |
|
29 |
in @{ML_file "Pure/Isar/spec_parse.ML"}. Parsers for method arguments |
|
30 |
are defined in @{ML_file "Pure/Isar/args.ML"}. |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
31 |
\end{readmore} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
32 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
33 |
*} |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
34 |
|
49 | 35 |
section {* Building Generic Parsers *} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
36 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
37 |
text {* |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
38 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
39 |
Let us first have a look at parsing strings using generic parsing |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
40 |
combinators. The function @{ML_ind "$$"} takes a string as argument and will |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
41 |
``consume'' this string from a given input list of strings. ``Consume'' in |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
42 |
this context means that it will return a pair consisting of this string and |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
43 |
the rest of the input list. For example: |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
44 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
45 |
@{ML_response [display,gray] |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
46 |
"($$ \"h\") (Symbol.explode \"hello\")" "(\"h\", [\"e\", \"l\", \"l\", \"o\"])"} |
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
47 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
48 |
@{ML_response [display,gray] |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
49 |
"($$ \"w\") (Symbol.explode \"world\")" "(\"w\", [\"o\", \"r\", \"l\", \"d\"])"} |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
50 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
51 |
The function @{ML "$$"} will either succeed (as in the two examples above) |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
52 |
or raise the exception @{text "FAIL"} if no string can be consumed. For |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
53 |
example trying to parse |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
54 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
55 |
@{ML_response_fake [display,gray] |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
56 |
"($$ \"x\") (Symbol.explode \"world\")" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
57 |
"Exception FAIL raised"} |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
58 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
59 |
will raise the exception @{text "FAIL"}. There are three exceptions used in |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
60 |
the parsing combinators: |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
61 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
62 |
\begin{itemize} |
58 | 63 |
\item @{text "FAIL"} is used to indicate that alternative routes of parsing |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
64 |
might be explored. |
58 | 65 |
\item @{text "MORE"} indicates that there is not enough input for the parser. For example |
66 |
in @{text "($$ \"h\") []"}. |
|
60
5b9c6010897b
doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents:
59
diff
changeset
|
67 |
\item @{text "ABORT"} is the exception that is raised when a dead end is reached. |
108
8bea3f74889d
added to the tactical chapter; polished; added the tabularstar environment (which is just tabular*)
Christian Urban <urbanc@in.tum.de>
parents:
105
diff
changeset
|
68 |
It is used for example in the function @{ML "!!"} (see below). |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
69 |
\end{itemize} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
70 |
|
50 | 71 |
However, note that these exceptions are private to the parser and cannot be accessed |
49 | 72 |
by the programmer (for example to handle them). |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
73 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
74 |
In the examples above we use the function @{ML_ind Symbol.explode}, instead of the |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
75 |
more standard library function @{ML_ind explode}, for obtaining an input list for |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
76 |
the parser. The reason is that @{ML_ind Symbol.explode} is aware of character sequences, |
261 | 77 |
for example @{text "\<foo>"}, that have a special meaning in Isabelle. To see |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
78 |
the difference consider |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
79 |
|
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
80 |
@{ML_response_fake [display,gray] |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
81 |
"let |
261 | 82 |
val input = \"\<foo> bar\" |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
83 |
in |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
84 |
(explode input, Symbol.explode input) |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
85 |
end" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
86 |
"([\"\\\", \"<\", \"f\", \"o\", \"o\", \">\", \" \", \"b\", \"a\", \"r\"], |
261 | 87 |
[\"\<foo>\", \" \", \"b\", \"a\", \"r\"])"} |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
88 |
|
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
89 |
Slightly more general than the parser @{ML "$$"} is the function |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
90 |
@{ML_ind one in Scan}, in that it takes a predicate as argument and |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
91 |
then parses exactly |
52 | 92 |
one item from the input list satisfying this predicate. For example the |
58 | 93 |
following parser either consumes an @{text [quotes] "h"} or a @{text |
49 | 94 |
[quotes] "w"}: |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
95 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
96 |
@{ML_response [display,gray] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
97 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
98 |
val hw = Scan.one (fn x => x = \"h\" orelse x = \"w\") |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
99 |
val input1 = Symbol.explode \"hello\" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
100 |
val input2 = Symbol.explode \"world\" |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
101 |
in |
236 | 102 |
(hw input1, hw input2) |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
103 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
104 |
"((\"h\", [\"e\", \"l\", \"l\", \"o\"]),(\"w\", [\"o\", \"r\", \"l\", \"d\"]))"} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
105 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
106 |
Two parsers can be connected in sequence by using the function @{ML_ind "--"}. |
220 | 107 |
For example parsing @{text "h"}, @{text "e"} and @{text "l"} (in this |
108 |
order) you can achieve by: |
|
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
109 |
|
236 | 110 |
@{ML_response [display,gray] |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
111 |
"($$ \"h\" -- $$ \"e\" -- $$ \"l\") (Symbol.explode \"hello\")" |
236 | 112 |
"(((\"h\", \"e\"), \"l\"), [\"l\", \"o\"])"} |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
113 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
114 |
Note how the result of consumed strings builds up on the left as nested pairs. |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
115 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
116 |
If, as in the previous example, you want to parse a particular string, |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
117 |
then you should use the function @{ML_ind this_string in Scan}: |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
118 |
|
236 | 119 |
@{ML_response [display,gray] |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
120 |
"Scan.this_string \"hell\" (Symbol.explode \"hello\")" |
236 | 121 |
"(\"hell\", [\"o\"])"} |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
122 |
|
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
123 |
Parsers that explore alternatives can be constructed using the function |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
124 |
@{ML_ind "||"}. The parser @{ML "(p || q)" for p q} returns the |
58 | 125 |
result of @{text "p"}, in case it succeeds, otherwise it returns the |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
126 |
result of @{text "q"}. For example: |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
127 |
|
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
128 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
129 |
@{ML_response [display,gray] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
130 |
"let |
236 | 131 |
val hw = $$ \"h\" || $$ \"w\" |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
132 |
val input1 = Symbol.explode \"hello\" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
133 |
val input2 = Symbol.explode \"world\" |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
134 |
in |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
135 |
(hw input1, hw input2) |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
136 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
137 |
"((\"h\", [\"e\", \"l\", \"l\", \"o\"]), (\"w\", [\"o\", \"r\", \"l\", \"d\"]))"} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
138 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
139 |
The functions @{ML_ind "|--"} and @{ML_ind "--|"} work like the sequencing function |
50 | 140 |
for parsers, except that they discard the item being parsed by the first (respectively second) |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
141 |
parser. For example: |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
142 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
143 |
@{ML_response [display,gray] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
144 |
"let |
236 | 145 |
val just_e = $$ \"h\" |-- $$ \"e\" |
146 |
val just_h = $$ \"h\" --| $$ \"e\" |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
147 |
val input = Symbol.explode \"hello\" |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
148 |
in |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
149 |
(just_e input, just_h input) |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
150 |
end" |
241 | 151 |
"((\"e\", [\"l\", \"l\", \"o\"]), (\"h\", [\"l\", \"l\", \"o\"]))"} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
152 |
|
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
153 |
The parser @{ML "Scan.optional p x" for p x} returns the result of the parser |
58 | 154 |
@{text "p"}, if it succeeds; otherwise it returns |
104 | 155 |
the default value @{text "x"}. For example: |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
156 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
157 |
@{ML_response [display,gray] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
158 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
159 |
val p = Scan.optional ($$ \"h\") \"x\" |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
160 |
val input1 = Symbol.explode \"hello\" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
161 |
val input2 = Symbol.explode \"world\" |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
162 |
in |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
163 |
(p input1, p input2) |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
164 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
165 |
"((\"h\", [\"e\", \"l\", \"l\", \"o\"]), (\"x\", [\"w\", \"o\", \"r\", \"l\", \"d\"]))"} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
166 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
167 |
The function @{ML_ind option in Scan} works similarly, except no default value can |
50 | 168 |
be given. Instead, the result is wrapped as an @{text "option"}-type. For example: |
169 |
||
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
170 |
@{ML_response [display,gray] |
50 | 171 |
"let |
172 |
val p = Scan.option ($$ \"h\") |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
173 |
val input1 = Symbol.explode \"hello\" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
174 |
val input2 = Symbol.explode \"world\" |
50 | 175 |
in |
176 |
(p input1, p input2) |
|
177 |
end" "((SOME \"h\", [\"e\", \"l\", \"l\", \"o\"]), (NONE, [\"w\", \"o\", \"r\", \"l\", \"d\"]))"} |
|
49 | 178 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
179 |
The function @{ML_ind "!!"} helps to produce appropriate error messages |
220 | 180 |
for parsing. For example if you want to parse @{text p} immediately |
58 | 181 |
followed by @{text q}, or start a completely different parser @{text r}, |
104 | 182 |
you might write: |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
183 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
184 |
@{ML [display,gray] "(p -- q) || r" for p q r} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
185 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
186 |
However, this parser is problematic for producing an appropriate error |
220 | 187 |
message, if the parsing of @{ML "(p -- q)" for p q} fails. Because in that |
188 |
case you lose the information that @{text p} should be followed by @{text q}. |
|
189 |
To see this assume that @{text p} is present in the input, but it is not |
|
190 |
followed by @{text q}. That means @{ML "(p -- q)" for p q} will fail and |
|
191 |
hence the alternative parser @{text r} will be tried. However, in many |
|
236 | 192 |
circumstances this will be the wrong parser for the input ``@{text "p"}-followed-by-something'' |
220 | 193 |
and therefore will also fail. The error message is then caused by the failure |
194 |
of @{text r}, not by the absence of @{text q} in the input. This kind of |
|
195 |
situation can be avoided when using the function @{ML "!!"}. This function |
|
196 |
aborts the whole process of parsing in case of a failure and prints an error |
|
197 |
message. For example if you invoke the parser |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
198 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
199 |
|
236 | 200 |
@{ML [display,gray] "!! (fn _ => \"foo\") ($$ \"h\")"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
201 |
|
58 | 202 |
on @{text [quotes] "hello"}, the parsing succeeds |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
203 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
204 |
@{ML_response [display,gray] |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
205 |
"(!! (fn _ => \"foo\") ($$ \"h\")) (Symbol.explode \"hello\")" |
236 | 206 |
"(\"h\", [\"e\", \"l\", \"l\", \"o\"])"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
207 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
208 |
but if you invoke it on @{text [quotes] "world"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
209 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
210 |
@{ML_response_fake [display,gray] "(!! (fn _ => \"foo\") ($$ \"h\")) (Symbol.explode \"world\")" |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
211 |
"Exception ABORT raised"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
212 |
|
108
8bea3f74889d
added to the tactical chapter; polished; added the tabularstar environment (which is just tabular*)
Christian Urban <urbanc@in.tum.de>
parents:
105
diff
changeset
|
213 |
then the parsing aborts and the error message @{text "foo"} is printed. In order to |
120
c39f83d8daeb
some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents:
116
diff
changeset
|
214 |
see the error message properly, you need to prefix the parser with the function |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
215 |
@{ML_ind error in Scan}. For example: |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
216 |
|
236 | 217 |
@{ML_response_fake [display,gray] |
218 |
"Scan.error (!! (fn _ => \"foo\") ($$ \"h\"))" |
|
219 |
"Exception Error \"foo\" raised"} |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
220 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
221 |
This ``prefixing'' is usually done by wrappers such as @{ML_ind local_theory in OuterSyntax} |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
222 |
(see Section~\ref{sec:newcommand} which explains this function in more detail). |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
223 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
224 |
Let us now return to our example of parsing @{ML "(p -- q) || r" for p q |
236 | 225 |
r}. If you want to generate the correct error message for |
226 |
@{text "p"}-followed-by-@{text "q"}, then you have to write: |
|
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
227 |
*} |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
228 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
229 |
ML{*fun p_followed_by_q p q r = |
133
3e94ccc0f31e
polishing and start of the section about attributes
Christian Urban <urbanc@in.tum.de>
parents:
132
diff
changeset
|
230 |
let |
236 | 231 |
val err_msg = fn _ => p ^ " is not followed by " ^ q |
133
3e94ccc0f31e
polishing and start of the section about attributes
Christian Urban <urbanc@in.tum.de>
parents:
132
diff
changeset
|
232 |
in |
3e94ccc0f31e
polishing and start of the section about attributes
Christian Urban <urbanc@in.tum.de>
parents:
132
diff
changeset
|
233 |
($$ p -- (!! err_msg ($$ q))) || ($$ r -- $$ r) |
3e94ccc0f31e
polishing and start of the section about attributes
Christian Urban <urbanc@in.tum.de>
parents:
132
diff
changeset
|
234 |
end *} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
235 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
236 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
237 |
text {* |
220 | 238 |
Running this parser with the arguments |
239 |
@{text [quotes] "h"}, @{text [quotes] "e"} and @{text [quotes] "w"}, and |
|
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
240 |
the input @{text [quotes] "holle"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
241 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
242 |
@{ML_response_fake [display,gray] "Scan.error (p_followed_by_q \"h\" \"e\" \"w\") (Symbol.explode \"holle\")" |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
243 |
"Exception ERROR \"h is not followed by e\" raised"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
244 |
|
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
245 |
produces the correct error message. Running it with |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
246 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
247 |
@{ML_response [display,gray] "Scan.error (p_followed_by_q \"h\" \"e\" \"w\") (Symbol.explode \"wworld\")" |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
248 |
"((\"w\", \"w\"), [\"o\", \"r\", \"l\", \"d\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
249 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
250 |
yields the expected parsing. |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
251 |
|
58 | 252 |
The function @{ML "Scan.repeat p" for p} will apply a parser @{text p} as |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
253 |
often as it succeeds. For example: |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
254 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
255 |
@{ML_response [display,gray] "Scan.repeat ($$ \"h\") (Symbol.explode \"hhhhello\")" |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
256 |
"([\"h\", \"h\", \"h\", \"h\"], [\"e\", \"l\", \"l\", \"o\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
257 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
258 |
Note that @{ML_ind repeat in Scan} stores the parsed items in a list. The function |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
259 |
@{ML_ind repeat1 in Scan} is similar, but requires that the parser @{text "p"} |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
260 |
succeeds at least once. |
48
609f9ef73494
fixed FIXME's in fake responses
Christian Urban <urbanc@in.tum.de>
parents:
47
diff
changeset
|
261 |
|
58 | 262 |
Also note that the parser would have aborted with the exception @{text MORE}, if |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
263 |
you had run it only on just @{text [quotes] "hhhh"}. This can be avoided by using |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
264 |
the wrapper @{ML_ind finite in Scan} and the ``stopper-token'' |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
265 |
@{ML_ind stopper in Symbol}. With them you can write: |
49 | 266 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
267 |
@{ML_response [display,gray] "Scan.finite Symbol.stopper (Scan.repeat ($$ \"h\")) (Symbol.explode \"hhhh\")" |
49 | 268 |
"([\"h\", \"h\", \"h\", \"h\"], [])"} |
269 |
||
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
270 |
@{ML Symbol.stopper} is the ``end-of-input'' indicator for parsing strings; |
128 | 271 |
other stoppers need to be used when parsing, for example, tokens. However, this kind of |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
272 |
manually wrapping is often already done by the surrounding infrastructure. |
49 | 273 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
274 |
The function @{ML_ind repeat in Scan} can be used with @{ML_ind one in Scan} to read any |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
275 |
string as in |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
276 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
277 |
@{ML_response [display,gray] |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
278 |
"let |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
279 |
val p = Scan.repeat (Scan.one Symbol.not_eof) |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
280 |
val input = Symbol.explode \"foo bar foo\" |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
281 |
in |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
282 |
Scan.finite Symbol.stopper p input |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
283 |
end" |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
284 |
"([\"f\", \"o\", \"o\", \" \", \"b\", \"a\", \"r\", \" \", \"f\", \"o\", \"o\"], [])"} |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
285 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
286 |
where the function @{ML_ind not_eof in Symbol} ensures that we do not read beyond the |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
287 |
end of the input string (i.e.~stopper symbol). |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
288 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
289 |
The function @{ML_ind unless in Scan} takes two parsers: if the first one can |
60
5b9c6010897b
doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents:
59
diff
changeset
|
290 |
parse the input, then the whole parser fails; if not, then the second is tried. Therefore |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
291 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
292 |
@{ML_response_fake_both [display,gray] "Scan.unless ($$ \"h\") ($$ \"w\") (Symbol.explode \"hello\")" |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
293 |
"Exception FAIL raised"} |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
294 |
|
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
295 |
fails, while |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
296 |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
297 |
@{ML_response [display,gray] "Scan.unless ($$ \"h\") ($$ \"w\") (Symbol.explode \"world\")" |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
298 |
"(\"w\",[\"o\", \"r\", \"l\", \"d\"])"} |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
299 |
|
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
300 |
succeeds. |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
301 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
302 |
The functions @{ML_ind repeat in Scan} and @{ML_ind unless in Scan} can |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
303 |
be combined to read any input until a certain marker symbol is reached. In the |
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
304 |
example below the marker symbol is a @{text [quotes] "*"}. |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
305 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
306 |
@{ML_response [display,gray] |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
307 |
"let |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
308 |
val p = Scan.repeat (Scan.unless ($$ \"*\") (Scan.one Symbol.not_eof)) |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
309 |
val input1 = Symbol.explode \"fooooo\" |
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
310 |
val input2 = Symbol.explode \"foo*ooo\" |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
311 |
in |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
312 |
(Scan.finite Symbol.stopper p input1, |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
313 |
Scan.finite Symbol.stopper p input2) |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
314 |
end" |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
315 |
"(([\"f\", \"o\", \"o\", \"o\", \"o\", \"o\"], []), |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
316 |
([\"f\", \"o\", \"o\"], [\"*\", \"o\", \"o\", \"o\"]))"} |
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
317 |
|
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
318 |
|
220 | 319 |
After parsing is done, you almost always want to apply a function to the parsed |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
320 |
items. One way to do this is the function @{ML_ind ">>"} where |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
321 |
@{ML "(p >> f)" for p f} runs |
58 | 322 |
first the parser @{text p} and upon successful completion applies the |
323 |
function @{text f} to the result. For example |
|
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
324 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
325 |
@{ML_response [display,gray] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
326 |
"let |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
327 |
fun double (x, y) = (x ^ x, y ^ y) |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
328 |
in |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
329 |
(($$ \"h\") -- ($$ \"e\") >> double) (Symbol.explode \"hello\") |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
330 |
end" |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
331 |
"((\"hh\", \"ee\"), [\"l\", \"l\", \"o\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
332 |
|
104 | 333 |
doubles the two parsed input strings; or |
59 | 334 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
335 |
@{ML_response [display,gray] |
59 | 336 |
"let |
104 | 337 |
val p = Scan.repeat (Scan.one Symbol.not_eof) |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
338 |
val input = Symbol.explode \"foo bar foo\" |
59 | 339 |
in |
104 | 340 |
Scan.finite Symbol.stopper (p >> implode) input |
59 | 341 |
end" |
342 |
"(\"foo bar foo\",[])"} |
|
343 |
||
60
5b9c6010897b
doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents:
59
diff
changeset
|
344 |
where the single-character strings in the parsed output are transformed |
59 | 345 |
back into one string. |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
346 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
347 |
(FIXME: move to an earlier place) |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
348 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
349 |
The function @{ML_ind ahead in Scan} parses some input, but leaves the original |
125 | 350 |
input unchanged. For example: |
351 |
||
352 |
@{ML_response [display,gray] |
|
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
353 |
"Scan.ahead (Scan.this_string \"foo\") (Symbol.explode \"foo\")" |
125 | 354 |
"(\"foo\", [\"f\", \"o\", \"o\"])"} |
56
126646f2aa88
added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents:
54
diff
changeset
|
355 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
356 |
The function @{ML_ind lift in Scan} takes a parser and a pair as arguments. This function applies |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
357 |
the given parser to the second component of the pair and leaves the first component |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
358 |
untouched. For example |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
359 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
360 |
@{ML_response [display,gray] |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
361 |
"Scan.lift ($$ \"h\" -- $$ \"e\") (1, Symbol.explode \"hello\")" |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
362 |
"((\"h\", \"e\"), (1, [\"l\", \"l\", \"o\"]))"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
363 |
|
43
02f76f1b6e7b
added positions to anti-quotations; removed old antiquotation_setup; tuned the text a bit
Christian Urban <urbanc@in.tum.de>
parents:
42
diff
changeset
|
364 |
(FIXME: In which situations is this useful? Give examples.) |
149 | 365 |
|
366 |
\begin{exercise}\label{ex:scancmts} |
|
367 |
Write a parser that parses an input string so that any comment enclosed |
|
220 | 368 |
within @{text "(*\<dots>*)"} is replaced by the same comment but enclosed within |
149 | 369 |
@{text "(**\<dots>**)"} in the output string. To enclose a string, you can use the |
370 |
function @{ML "enclose s1 s2 s" for s1 s2 s} which produces the string @{ML |
|
236 | 371 |
"s1 ^ s ^ s2" for s1 s2 s}. Hint: To simplify the task ignore the proper |
372 |
nesting of comments. |
|
149 | 373 |
\end{exercise} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
374 |
*} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
375 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
376 |
section {* Parsing Theory Syntax *} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
377 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
378 |
text {* |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
379 |
Most of the time, however, Isabelle developers have to deal with parsing |
156 | 380 |
tokens, not strings. These token parsers have the type: |
128 | 381 |
*} |
382 |
||
383 |
ML{*type 'a parser = OuterLex.token list -> 'a * OuterLex.token list*} |
|
384 |
||
385 |
text {* |
|
149 | 386 |
The reason for using token parsers is that theory syntax, as well as the |
128 | 387 |
parsers for the arguments of proof methods, use the type @{ML_type |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
388 |
OuterLex.token}. |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
389 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
390 |
\begin{readmore} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
391 |
The parser functions for the theory syntax are contained in the structure |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
392 |
@{ML_struct OuterParse} defined in the file @{ML_file "Pure/Isar/outer_parse.ML"}. |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
393 |
The definition for tokens is in the file @{ML_file "Pure/Isar/outer_lex.ML"}. |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
394 |
\end{readmore} |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
395 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
396 |
The structure @{ML_struct OuterLex} defines several kinds of tokens (for |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
397 |
example @{ML_ind Ident in OuterLex} for identifiers, @{ML Keyword in |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
398 |
OuterLex} for keywords and @{ML_ind Command in OuterLex} for commands). Some |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
399 |
token parsers take into account the kind of tokens. The first example shows |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
400 |
how to generate a token list out of a string using the function |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
401 |
@{ML_ind scan in OuterSyntax}. It is given the argument |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
402 |
@{ML "Position.none"} since, |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
403 |
at the moment, we are not interested in generating precise error |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
404 |
messages. The following code\footnote{Note that because of a possible bug in |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
405 |
the PolyML runtime system, the result is printed as @{text [quotes] "?"}, |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
406 |
instead of the tokens.} |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
407 |
|
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
408 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
409 |
@{ML_response_fake [display,gray] "OuterSyntax.scan Position.none \"hello world\"" |
50 | 410 |
"[Token (\<dots>,(Ident, \"hello\"),\<dots>), |
411 |
Token (\<dots>,(Space, \" \"),\<dots>), |
|
412 |
Token (\<dots>,(Ident, \"world\"),\<dots>)]"} |
|
413 |
||
414 |
produces three tokens where the first and the last are identifiers, since |
|
58 | 415 |
@{text [quotes] "hello"} and @{text [quotes] "world"} do not match any |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
416 |
other syntactic category. The second indicates a space. |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
417 |
|
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
418 |
We can easily change what is recognised as a keyword with |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
419 |
@{ML_ind keyword in OuterKeyword}. For example calling this function |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
420 |
*} |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
421 |
|
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
422 |
ML{*val _ = OuterKeyword.keyword "hello"*} |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
423 |
|
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
424 |
text {* |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
425 |
then lexing @{text [quotes] "hello world"} will produce |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
426 |
|
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
427 |
@{ML_response_fake [display,gray] "OuterSyntax.scan Position.none \"hello world\"" |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
428 |
"[Token (\<dots>,(Keyword, \"hello\"),\<dots>), |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
429 |
Token (\<dots>,(Space, \" \"),\<dots>), |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
430 |
Token (\<dots>,(Ident, \"world\"),\<dots>)]"} |
50 | 431 |
|
241 | 432 |
Many parsing functions later on will require white space, comments and the like |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
433 |
to have already been filtered out. So from now on we are going to use the |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
434 |
functions @{ML filter} and @{ML_ind is_proper in OuterLex} to do this. |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
435 |
For example: |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
436 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
437 |
@{ML_response_fake [display,gray] |
50 | 438 |
"let |
439 |
val input = OuterSyntax.scan Position.none \"hello world\" |
|
440 |
in |
|
441 |
filter OuterLex.is_proper input |
|
442 |
end" |
|
443 |
"[Token (\<dots>,(Ident, \"hello\"), \<dots>), Token (\<dots>,(Ident, \"world\"), \<dots>)]"} |
|
444 |
||
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
445 |
For convenience we define the function: |
50 | 446 |
*} |
447 |
||
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
448 |
ML{*fun filtered_input str = |
160
cc9359bfacf4
redefined the functions warning and tracing in order to properly match more antiquotations
Christian Urban <urbanc@in.tum.de>
parents:
156
diff
changeset
|
449 |
filter OuterLex.is_proper (OuterSyntax.scan Position.none str) *} |
50 | 450 |
|
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
451 |
text {* |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
452 |
If you now parse |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
453 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
454 |
@{ML_response_fake [display,gray] |
50 | 455 |
"filtered_input \"inductive | for\"" |
456 |
"[Token (\<dots>,(Command, \"inductive\"),\<dots>), |
|
457 |
Token (\<dots>,(Keyword, \"|\"),\<dots>), |
|
458 |
Token (\<dots>,(Keyword, \"for\"),\<dots>)]"} |
|
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
459 |
|
221 | 460 |
you obtain a list consisting of only one command and two keyword tokens. |
241 | 461 |
If you want to see which keywords and commands are currently known to Isabelle, |
462 |
type: |
|
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
463 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
464 |
@{ML_response_fake [display,gray] |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
465 |
"let |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
466 |
val (keywords, commands) = OuterKeyword.get_lexicons () |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
467 |
in |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
468 |
(Scan.dest_lexicon commands, Scan.dest_lexicon keywords) |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
469 |
end" |
132 | 470 |
"([\"}\", \"{\", \<dots>], [\"\<rightleftharpoons>\", \"\<leftharpoondown>\", \<dots>])"} |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
471 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
472 |
You might have to adjust the @{ML_ind print_depth} in order to |
241 | 473 |
see the complete list. |
474 |
||
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
475 |
The parser @{ML_ind "$$$" in OuterParse} parses a single keyword. For example: |
50 | 476 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
477 |
@{ML_response [display,gray] |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
478 |
"let |
50 | 479 |
val input1 = filtered_input \"where for\" |
480 |
val input2 = filtered_input \"| in\" |
|
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
481 |
in |
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
482 |
(OuterParse.$$$ \"where\" input1, OuterParse.$$$ \"|\" input2) |
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
483 |
end" |
128 | 484 |
"((\"where\",\<dots>), (\"|\",\<dots>))"} |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
485 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
486 |
Any non-keyword string can be parsed with the function @{ML_ind reserved in OuterParse}. |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
487 |
For example: |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
488 |
|
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
489 |
@{ML_response [display,gray] |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
490 |
"let |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
491 |
val p = OuterParse.reserved \"bar\" |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
492 |
val input = filtered_input \"bar\" |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
493 |
in |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
494 |
p input |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
495 |
end" |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
496 |
"(\"bar\",[])"} |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
497 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
498 |
Like before, you can sequentially connect parsers with @{ML_ind "--"}. For example: |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
499 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
500 |
@{ML_response [display,gray] |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
501 |
"let |
50 | 502 |
val input = filtered_input \"| in\" |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
503 |
in |
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
504 |
(OuterParse.$$$ \"|\" -- OuterParse.$$$ \"in\") input |
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
505 |
end" |
183
8bb4eaa2ec92
a simplification suggested by Stefan and some polishing
Christian Urban <urbanc@in.tum.de>
parents:
181
diff
changeset
|
506 |
"((\"|\", \"in\"), [])"} |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
507 |
|
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
508 |
The parser @{ML "OuterParse.enum s p" for s p} parses a possibly empty |
58 | 509 |
list of items recognised by the parser @{text p}, where the items being parsed |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
510 |
are separated by the string @{text s}. For example: |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
511 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
512 |
@{ML_response [display,gray] |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
513 |
"let |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
514 |
val input = filtered_input \"in | in | in foo\" |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
515 |
in |
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
516 |
(OuterParse.enum \"|\" (OuterParse.$$$ \"in\")) input |
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
517 |
end" |
183
8bb4eaa2ec92
a simplification suggested by Stefan and some polishing
Christian Urban <urbanc@in.tum.de>
parents:
181
diff
changeset
|
518 |
"([\"in\", \"in\", \"in\"], [\<dots>])"} |
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
519 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
520 |
@{ML_ind enum1 in OuterParse} works similarly, except that the parsed list must |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
521 |
be non-empty. Note that we had to add a string @{text [quotes] "foo"} at the |
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
522 |
end of the parsed string, otherwise the parser would have consumed all |
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
523 |
tokens and then failed with the exception @{text "MORE"}. Like in the |
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
524 |
previous section, we can avoid this exception using the wrapper @{ML |
50 | 525 |
Scan.finite}. This time, however, we have to use the ``stopper-token'' @{ML |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
526 |
OuterLex.stopper}. We can write: |
49 | 527 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
528 |
@{ML_response [display,gray] |
49 | 529 |
"let |
50 | 530 |
val input = filtered_input \"in | in | in\" |
49 | 531 |
in |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
532 |
Scan.finite OuterLex.stopper |
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
533 |
(OuterParse.enum \"|\" (OuterParse.$$$ \"in\")) input |
49 | 534 |
end" |
183
8bb4eaa2ec92
a simplification suggested by Stefan and some polishing
Christian Urban <urbanc@in.tum.de>
parents:
181
diff
changeset
|
535 |
"([\"in\", \"in\", \"in\"], [])"} |
49 | 536 |
|
75 | 537 |
The following function will help to run examples. |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
538 |
*} |
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
539 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
540 |
ML{*fun parse p input = Scan.finite OuterLex.stopper (Scan.error p) input *} |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
541 |
|
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
542 |
text {* |
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
543 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
544 |
The function @{ML_ind "!!!" in OuterParse} can be used to force termination of the |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
545 |
parser in case of a dead end, just like @{ML "Scan.!!"} (see previous section). |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
546 |
Except that the error message of @{ML "OuterParse.!!!"} is fixed to be |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
547 |
@{text [quotes] "Outer syntax error"} |
221 | 548 |
together with a relatively precise description of the failure. For example: |
49 | 549 |
|
72
7b8c4fe235aa
added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents:
69
diff
changeset
|
550 |
@{ML_response_fake [display,gray] |
49 | 551 |
"let |
50 | 552 |
val input = filtered_input \"in |\" |
49 | 553 |
val parse_bar_then_in = OuterParse.$$$ \"|\" -- OuterParse.$$$ \"in\" |
554 |
in |
|
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
555 |
parse (OuterParse.!!! parse_bar_then_in) input |
49 | 556 |
end" |
557 |
"Exception ERROR \"Outer syntax error: keyword \"|\" expected, |
|
558 |
but keyword in was found\" raised" |
|
559 |
} |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
560 |
|
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
561 |
\begin{exercise} (FIXME) |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
562 |
A type-identifier, for example @{typ "'a"}, is a token of |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
563 |
kind @{ML_ind Keyword in OuterLex}. It can be parsed using |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
564 |
the function @{ML type_ident in OuterParse}. |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
565 |
\end{exercise} |
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
566 |
|
104 | 567 |
(FIXME: or give parser for numbers) |
53
0c3580c831a4
removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents:
52
diff
changeset
|
568 |
|
125 | 569 |
Whenever there is a possibility that the processing of user input can fail, |
221 | 570 |
it is a good idea to give all available information about where the error |
220 | 571 |
occurred. For this Isabelle can attach positional information to tokens |
125 | 572 |
and then thread this information up the processing chain. To see this, |
128 | 573 |
modify the function @{ML filtered_input} described earlier to |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
574 |
*} |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
575 |
|
125 | 576 |
ML{*fun filtered_input' str = |
577 |
filter OuterLex.is_proper (OuterSyntax.scan (Position.line 7) str) *} |
|
49 | 578 |
|
579 |
text {* |
|
125 | 580 |
where we pretend the parsed string starts on line 7. An example is |
49 | 581 |
|
125 | 582 |
@{ML_response_fake [display,gray] |
583 |
"filtered_input' \"foo \\n bar\"" |
|
584 |
"[Token ((\"foo\", ({line=7, end_line=7}, {line=7})), (Ident, \"foo\"), \<dots>), |
|
585 |
Token ((\"bar\", ({line=8, end_line=8}, {line=8})), (Ident, \"bar\"), \<dots>)]"} |
|
586 |
||
587 |
in which the @{text [quotes] "\\n"} causes the second token to be in |
|
588 |
line 8. |
|
589 |
||
241 | 590 |
By using the parser @{ML OuterParse.position} you can access the token position |
591 |
and return it as part of the parser result. For example |
|
125 | 592 |
|
593 |
@{ML_response_fake [display,gray] |
|
594 |
"let |
|
241 | 595 |
val input = filtered_input' \"where\" |
125 | 596 |
in |
597 |
parse (OuterParse.position (OuterParse.$$$ \"where\")) input |
|
598 |
end" |
|
599 |
"((\"where\", {line=7, end_line=7}), [])"} |
|
600 |
||
601 |
\begin{readmore} |
|
602 |
The functions related to positions are implemented in the file |
|
603 |
@{ML_file "Pure/General/position.ML"}. |
|
604 |
\end{readmore} |
|
49 | 605 |
|
606 |
*} |
|
607 |
||
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
608 |
text {* |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
609 |
(FIXME: there are also handy parsers for ML-expressions and ML-files) |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
610 |
*} |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
611 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
612 |
section {* Context Parser (TBD) *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
613 |
|
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
614 |
text {* |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
615 |
Used for example in \isacommand{attribute\_setup} and \isacommand{method\_setup}. |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
616 |
*} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
617 |
|
207 | 618 |
section {* Argument and Attribute Parsers (TBD) *} |
619 |
||
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
620 |
section {* Parsing Inner Syntax *} |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
621 |
|
125 | 622 |
text {* |
623 |
There is usually no need to write your own parser for parsing inner syntax, that is |
|
285 | 624 |
for terms and types: you can just call the predefined parsers. Terms can |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
625 |
be parsed using the function @{ML_ind term in OuterParse}. For example: |
125 | 626 |
|
627 |
@{ML_response [display,gray] |
|
628 |
"let |
|
629 |
val input = OuterSyntax.scan Position.none \"foo\" |
|
44
dee4b3e66dfe
added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents:
43
diff
changeset
|
630 |
in |
125 | 631 |
OuterParse.term input |
632 |
end" |
|
633 |
"(\"\\^E\\^Ftoken\\^Efoo\\^E\\^F\\^E\", [])"} |
|
634 |
||
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
635 |
The function @{ML_ind prop in OuterParse} is similar, except that it gives a different |
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
636 |
error message, when parsing fails. As you can see, the parser not just returns |
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
637 |
the parsed string, but also some encoded information. You can decode the |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
638 |
information with the function @{ML_ind parse in YXML}. For example |
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
639 |
|
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
640 |
@{ML_response [display,gray] |
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
641 |
"YXML.parse \"\\^E\\^Ftoken\\^Efoo\\^E\\^F\\^E\"" |
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
642 |
"XML.Elem (\"token\", [], [XML.Text \"foo\"])"} |
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
643 |
|
149 | 644 |
The result of the decoding is an XML-tree. You can see better what is going on if |
131 | 645 |
you replace @{ML Position.none} by @{ML "Position.line 42"}, say: |
101 | 646 |
|
125 | 647 |
@{ML_response [display,gray] |
648 |
"let |
|
649 |
val input = OuterSyntax.scan (Position.line 42) \"foo\" |
|
650 |
in |
|
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
651 |
YXML.parse (fst (OuterParse.term input)) |
125 | 652 |
end" |
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
653 |
"XML.Elem (\"token\", [(\"line\", \"42\"), (\"end_line\", \"42\")], [XML.Text \"foo\"])"} |
125 | 654 |
|
149 | 655 |
The positional information is stored as part of an XML-tree so that code |
656 |
called later on will be able to give more precise error messages. |
|
125 | 657 |
|
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
658 |
\begin{readmore} |
128 | 659 |
The functions to do with input and output of XML and YXML are defined |
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
660 |
in @{ML_file "Pure/General/xml.ML"} and @{ML_file "Pure/General/yxml.ML"}. |
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
661 |
\end{readmore} |
160
cc9359bfacf4
redefined the functions warning and tracing in order to properly match more antiquotations
Christian Urban <urbanc@in.tum.de>
parents:
156
diff
changeset
|
662 |
|
125 | 663 |
*} |
101 | 664 |
|
116
c9ff326e3ce5
more changes to the package chapter
Christian Urban <urbanc@in.tum.de>
parents:
114
diff
changeset
|
665 |
section {* Parsing Specifications\label{sec:parsingspecs} *} |
101 | 666 |
|
667 |
text {* |
|
121 | 668 |
There are a number of special purpose parsers that help with parsing |
156 | 669 |
specifications of function definitions, inductive predicates and so on. In |
220 | 670 |
Chapter~\ref{chp:package}, for example, we will need to parse specifications |
121 | 671 |
for inductive predicates of the form: |
672 |
*} |
|
101 | 673 |
|
121 | 674 |
simple_inductive |
675 |
even and odd |
|
676 |
where |
|
677 |
even0: "even 0" |
|
678 |
| evenS: "odd n \<Longrightarrow> even (Suc n)" |
|
679 |
| oddS: "even n \<Longrightarrow> odd (Suc n)" |
|
101 | 680 |
|
681 |
text {* |
|
121 | 682 |
For this we are going to use the parser: |
101 | 683 |
*} |
684 |
||
121 | 685 |
ML %linenosgray{*val spec_parser = |
126 | 686 |
OuterParse.fixes -- |
687 |
Scan.optional |
|
688 |
(OuterParse.$$$ "where" |-- |
|
689 |
OuterParse.!!! |
|
690 |
(OuterParse.enum1 "|" |
|
691 |
(SpecParse.opt_thm_name ":" -- OuterParse.prop))) []*} |
|
120
c39f83d8daeb
some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents:
116
diff
changeset
|
692 |
|
101 | 693 |
text {* |
241 | 694 |
Note that the parser must not parse the keyword \simpleinductive, even if it is |
126 | 695 |
meant to process definitions as shown above. The parser of the keyword |
128 | 696 |
will be given by the infrastructure that will eventually call @{ML spec_parser}. |
126 | 697 |
|
698 |
||
124
0b9fa606a746
added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents:
122
diff
changeset
|
699 |
To see what the parser returns, let us parse the string corresponding to the |
121 | 700 |
definition of @{term even} and @{term odd}: |
701 |
||
101 | 702 |
@{ML_response [display,gray] |
703 |
"let |
|
704 |
val input = filtered_input |
|
705 |
(\"even and odd \" ^ |
|
706 |
\"where \" ^ |
|
707 |
\" even0[intro]: \\\"even 0\\\" \" ^ |
|
708 |
\"| evenS[intro]: \\\"odd n \<Longrightarrow> even (Suc n)\\\" \" ^ |
|
709 |
\"| oddS[intro]: \\\"even n \<Longrightarrow> odd (Suc n)\\\"\") |
|
710 |
in |
|
120
c39f83d8daeb
some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents:
116
diff
changeset
|
711 |
parse spec_parser input |
101 | 712 |
end" |
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
713 |
"(([(even, NONE, NoSyn), (odd, NONE, NoSyn)], |
101 | 714 |
[((even0,\<dots>), \"\\^E\\^Ftoken\\^Eeven 0\\^E\\^F\\^E\"), |
715 |
((evenS,\<dots>), \"\\^E\\^Ftoken\\^Eodd n \<Longrightarrow> even (Suc n)\\^E\\^F\\^E\"), |
|
716 |
((oddS,\<dots>), \"\\^E\\^Ftoken\\^Eeven n \<Longrightarrow> odd (Suc n)\\^E\\^F\\^E\")]), [])"} |
|
121 | 717 |
|
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
718 |
As you see, the result is a pair consisting of a list of |
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
719 |
variables with optional type-annotation and syntax-annotation, and a list of |
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
720 |
rules where every rule has optionally a name and an attribute. |
121 | 721 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
722 |
The function @{ML_ind "fixes" in OuterParse} in Line 2 of the parser reads an |
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
723 |
\isacommand{and}-separated |
124
0b9fa606a746
added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents:
122
diff
changeset
|
724 |
list of variables that can include optional type annotations and syntax translations. |
121 | 725 |
For example:\footnote{Note that in the code we need to write |
726 |
@{text "\\\"int \<Rightarrow> bool\\\""} in order to properly escape the double quotes |
|
727 |
in the compound type.} |
|
728 |
||
729 |
@{ML_response [display,gray] |
|
730 |
"let |
|
731 |
val input = filtered_input |
|
732 |
\"foo::\\\"int \<Rightarrow> bool\\\" and bar::nat (\\\"BAR\\\" 100) and blonk\" |
|
733 |
in |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
734 |
parse OuterParse.fixes input |
121 | 735 |
end" |
736 |
"([(foo, SOME \"\\^E\\^Ftoken\\^Eint \<Rightarrow> bool\\^E\\^F\\^E\", NoSyn), |
|
737 |
(bar, SOME \"\\^E\\^Ftoken\\^Enat\\^E\\^F\\^E\", Mixfix (\"BAR\", [], 100)), |
|
738 |
(blonk, NONE, NoSyn)],[])"} |
|
50 | 739 |
*} |
740 |
||
121 | 741 |
text {* |
156 | 742 |
Whenever types are given, they are stored in the @{ML SOME}s. The types are |
743 |
not yet used to type the variables: this must be done by type-inference later |
|
149 | 744 |
on. Since types are part of the inner syntax they are strings with some |
241 | 745 |
encoded information (see previous section). If a mixfix-syntax is |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
746 |
present for a variable, then it is stored in the @{ML_ind Mixfix} data structure; |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
747 |
no syntax translation is indicated by @{ML_ind NoSyn}. |
121 | 748 |
|
749 |
\begin{readmore} |
|
241 | 750 |
The data structure for mixfix annotations is defined in @{ML_file "Pure/Syntax/mixfix.ML"}. |
121 | 751 |
\end{readmore} |
752 |
||
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
753 |
Lines 3 to 7 in the function @{ML spec_parser} implement the parser for a |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
754 |
list of introduction rules, that is propositions with theorem annotations |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
755 |
such as rule names and attributes. The introduction rules are propositions |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
756 |
parsed by @{ML_ind prop in OuterParse}. However, they can include an optional |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
757 |
theorem name plus some attributes. For example |
121 | 758 |
|
759 |
@{ML_response [display,gray] "let |
|
760 |
val input = filtered_input \"foo_lemma[intro,dest!]:\" |
|
761 |
val ((name, attrib), _) = parse (SpecParse.thm_name \":\") input |
|
762 |
in |
|
763 |
(name, map Args.dest_src attrib) |
|
764 |
end" "(foo_lemma, [((\"intro\", []), \<dots>), ((\"dest\", [\<dots>]), \<dots>)])"} |
|
765 |
||
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
766 |
The function @{ML_ind opt_thm_name in SpecParse} is the ``optional'' variant of |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
767 |
@{ML_ind thm_name in SpecParse}. Theorem names can contain attributes. The name |
131 | 768 |
has to end with @{text [quotes] ":"}---see the argument of |
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
769 |
the function @{ML SpecParse.opt_thm_name} in Line 7. |
121 | 770 |
|
771 |
\begin{readmore} |
|
772 |
Attributes and arguments are implemented in the files @{ML_file "Pure/Isar/attrib.ML"} |
|
773 |
and @{ML_file "Pure/Isar/args.ML"}. |
|
774 |
\end{readmore} |
|
101 | 775 |
*} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
776 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
777 |
text_raw {* |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
778 |
\begin{exercise} |
207 | 779 |
Have a look at how the parser @{ML SpecParse.where_alt_specs} is implemented |
780 |
in file @{ML_file "Pure/Isar/spec_parse.ML"}. This parser corresponds |
|
781 |
to the ``where-part'' of the introduction rules given above. Below |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
782 |
we paraphrase the code of @{ML_ind where_alt_specs in SpecParse} adapted to our |
207 | 783 |
purposes. |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
784 |
\begin{isabelle} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
785 |
*} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
786 |
ML %linenosgray{*val spec_parser' = |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
787 |
OuterParse.fixes -- |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
788 |
Scan.optional |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
789 |
(OuterParse.$$$ "where" |-- |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
790 |
OuterParse.!!! |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
791 |
(OuterParse.enum1 "|" |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
792 |
((SpecParse.opt_thm_name ":" -- OuterParse.prop) --| |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
793 |
Scan.option (Scan.ahead (OuterParse.name || |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
794 |
OuterParse.$$$ "[") -- |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
795 |
OuterParse.!!! (OuterParse.$$$ "|"))))) [] *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
796 |
text_raw {* |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
797 |
\end{isabelle} |
284 | 798 |
Both parsers accept the same input% that's not true: |
799 |
% spec_parser accepts input that is refuted by spec_parser' |
|
800 |
, but if you look closely, you can notice |
|
207 | 801 |
an additional ``tail'' (Lines 8 to 10) in @{ML spec_parser'}. What is the purpose of |
802 |
this additional ``tail''? |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
803 |
\end{exercise} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
804 |
*} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
805 |
|
229
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
806 |
text {* |
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
807 |
(FIXME: @{ML OuterParse.type_args}, @{ML OuterParse.typ}, @{ML OuterParse.opt_mixfix}) |
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
808 |
*} |
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
809 |
|
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
810 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
811 |
section {* New Commands and Keyword Files\label{sec:newcommand} *} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
812 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
813 |
text {* |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
814 |
Often new commands, for example for providing new definitional principles, |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
815 |
need to be implemented. While this is not difficult on the ML-level, |
66 | 816 |
new commands, in order to be useful, need to be recognised by |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
817 |
ProofGeneral. This results in some subtle configuration issues, which we |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
818 |
will explain in this section. |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
819 |
|
74 | 820 |
To keep things simple, let us start with a ``silly'' command that does nothing |
821 |
at all. We shall name this command \isacommand{foobar}. On the ML-level it can be |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
822 |
defined as: |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
823 |
*} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
824 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
825 |
ML{*let |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
826 |
val do_nothing = Scan.succeed (LocalTheory.theory I) |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
827 |
val kind = OuterKeyword.thy_decl |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
828 |
in |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
829 |
OuterSyntax.local_theory "foobar" "description of foobar" kind do_nothing |
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
830 |
end *} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
831 |
|
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
832 |
text {* |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
833 |
The crucial function @{ML_ind local_theory in OuterSyntax} expects a name for the command, a |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
834 |
short description, a kind indicator (which we will explain later more thoroughly) and a |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
835 |
parser producing a local theory transition (its purpose will also explained |
66 | 836 |
later). |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
837 |
|
101 | 838 |
While this is everything you have to do on the ML-level, you need a keyword |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
839 |
file that can be loaded by ProofGeneral. This is to enable ProofGeneral to |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
840 |
recognise \isacommand{foobar} as a command. Such a keyword file can be |
74 | 841 |
generated with the command-line: |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
842 |
|
74 | 843 |
@{text [display] "$ isabelle keywords -k foobar some_log_files"} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
844 |
|
74 | 845 |
The option @{text "-k foobar"} indicates which postfix the name of the keyword file |
80 | 846 |
will be assigned. In the case above the file will be named @{text |
86 | 847 |
"isar-keywords-foobar.el"}. This command requires log files to be |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
848 |
present (in order to extract the keywords from them). To generate these log |
101 | 849 |
files, you first need to package the code above into a separate theory file named |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
850 |
@{text "Command.thy"}, say---see Figure~\ref{fig:commandtheory} for the |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
851 |
complete code. |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
852 |
|
66 | 853 |
|
854 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
855 |
\begin{figure}[t] |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
856 |
\begin{graybox}\small |
66 | 857 |
\isacommand{theory}~@{text Command}\\ |
858 |
\isacommand{imports}~@{text Main}\\ |
|
859 |
\isacommand{begin}\\ |
|
85
b02904872d6b
better handling of {* and *}
Christian Urban <urbanc@in.tum.de>
parents:
81
diff
changeset
|
860 |
\isacommand{ML}~@{text "\<verbopen>"}\\ |
66 | 861 |
@{ML |
862 |
"let |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
863 |
val do_nothing = Scan.succeed (LocalTheory.theory I) |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
864 |
val kind = OuterKeyword.thy_decl |
66 | 865 |
in |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
866 |
OuterSyntax.local_theory \"foobar\" \"description of foobar\" kind do_nothing |
66 | 867 |
end"}\\ |
85
b02904872d6b
better handling of {* and *}
Christian Urban <urbanc@in.tum.de>
parents:
81
diff
changeset
|
868 |
@{text "\<verbclose>"}\\ |
66 | 869 |
\isacommand{end} |
80 | 870 |
\end{graybox} |
241 | 871 |
\caption{This file can be used to generate a log file. This log file in turn can |
872 |
be used to generate a keyword file containing the command \isacommand{foobar}. |
|
873 |
\label{fig:commandtheory}} |
|
66 | 874 |
\end{figure} |
875 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
876 |
||
75 | 877 |
For our purposes it is sufficient to use the log files of the theories |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
878 |
@{text "Pure"}, @{text "HOL"} and @{text "Pure-ProofGeneral"}, as well as |
75 | 879 |
the log file for the theory @{text "Command.thy"}, which contains the new |
880 |
\isacommand{foobar}-command. If you target other logics besides HOL, such |
|
74 | 881 |
as Nominal or ZF, then you need to adapt the log files appropriately. |
104 | 882 |
|
74 | 883 |
@{text Pure} and @{text HOL} are usually compiled during the installation of |
884 |
Isabelle. So log files for them should be already available. If not, then |
|
75 | 885 |
they can be conveniently compiled with the help of the build-script from the Isabelle |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
886 |
distribution. |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
887 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
888 |
@{text [display] |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
889 |
"$ ./build -m \"Pure\" |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
890 |
$ ./build -m \"HOL\""} |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
891 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
892 |
The @{text "Pure-ProofGeneral"} theory needs to be compiled with: |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
893 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
894 |
@{text [display] "$ ./build -m \"Pure-ProofGeneral\" \"Pure\""} |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
895 |
|
101 | 896 |
For the theory @{text "Command.thy"}, you first need to create a ``managed'' subdirectory |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
897 |
with: |
66 | 898 |
|
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
899 |
@{text [display] "$ isabelle mkdir FoobarCommand"} |
66 | 900 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
901 |
This generates a directory containing the files: |
66 | 902 |
|
903 |
@{text [display] |
|
904 |
"./IsaMakefile |
|
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
905 |
./FoobarCommand/ROOT.ML |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
906 |
./FoobarCommand/document |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
907 |
./FoobarCommand/document/root.tex"} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
908 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
909 |
|
101 | 910 |
You need to copy the file @{text "Command.thy"} into the directory @{text "FoobarCommand"} |
66 | 911 |
and add the line |
912 |
||
207 | 913 |
@{text [display] "no_document use_thy \"Command\";"} |
66 | 914 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
915 |
to the file @{text "./FoobarCommand/ROOT.ML"}. You can now compile the theory by just typing: |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
916 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
917 |
@{text [display] "$ isabelle make"} |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
918 |
|
101 | 919 |
If the compilation succeeds, you have finally created all the necessary log files. |
920 |
They are stored in the directory |
|
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
921 |
|
241 | 922 |
@{text [display] "~/.isabelle/heaps/Isabelle2009/polyml-5.2.1_x86-linux/log"} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
923 |
|
74 | 924 |
or something similar depending on your Isabelle distribution and architecture. |
925 |
One quick way to assign a shell variable to this directory is by typing |
|
66 | 926 |
|
927 |
@{text [display] "$ ISABELLE_LOGS=\"$(isabelle getenv -b ISABELLE_OUTPUT)\"/log"} |
|
928 |
||
156 | 929 |
on the Unix prompt. If you now type @{text "ls $ISABELLE_LOGS"}, then the |
128 | 930 |
directory should include the files: |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
931 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
932 |
@{text [display] |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
933 |
"Pure.gz |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
934 |
HOL.gz |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
935 |
Pure-ProofGeneral.gz |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
936 |
HOL-FoobarCommand.gz"} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
937 |
|
101 | 938 |
From them you can create the keyword files. Assuming the name |
75 | 939 |
of the directory is in @{text "$ISABELLE_LOGS"}, |
74 | 940 |
then the Unix command for creating the keyword file is: |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
941 |
|
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
942 |
@{text [display] |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
943 |
"$ isabelle keywords -k foobar |
80 | 944 |
$ISABELLE_LOGS/{Pure.gz,HOL.gz,Pure-ProofGeneral.gz,HOL-FoobarCommand.gz}"} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
945 |
|
80 | 946 |
The result is the file @{text "isar-keywords-foobar.el"}. It should contain |
86 | 947 |
the string @{text "foobar"} twice.\footnote{To see whether things are fine, check |
80 | 948 |
that @{text "grep foobar"} on this file returns something |
86 | 949 |
non-empty.} This keyword file needs to |
241 | 950 |
be copied into the directory @{text "~/.isabelle/etc"}. To make ProofGeneral |
101 | 951 |
aware of this keyword file, you have to start Isabelle with the option @{text |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
952 |
"-k foobar"}, that is: |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
953 |
|
80 | 954 |
|
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
955 |
@{text [display] "$ isabelle emacs -k foobar a_theory_file"} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
956 |
|
101 | 957 |
If you now build a theory on top of @{text "Command.thy"}, |
958 |
then the command \isacommand{foobar} can be used. |
|
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
959 |
Similarly with any other new command, and also any new keyword that is |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
960 |
introduced with |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
961 |
*} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
962 |
|
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
963 |
ML{*val _ = OuterKeyword.keyword "blink" *} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
964 |
|
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
965 |
text {* |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
966 |
At the moment the command \isacommand{foobar} is not very useful. Let us refine |
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
967 |
it a bit |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
968 |
next by letting it take a proposition as argument and printing this proposition |
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
969 |
inside the tracing buffer. |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
970 |
|
75 | 971 |
The crucial part of a command is the function that determines the behaviour |
972 |
of the command. In the code above we used a ``do-nothing''-function, which |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
973 |
because of @{ML_ind succeed in Scan} does not parse any argument, but immediately |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
974 |
returns the simple function @{ML "LocalTheory.theory I"}. We can |
75 | 975 |
replace this code by a function that first parses a proposition (using the |
976 |
parser @{ML OuterParse.prop}), then prints out the tracing |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
977 |
information (using a new function @{text trace_prop}) and |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
978 |
finally does nothing. For this you can write: |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
979 |
*} |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
980 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
981 |
ML{*let |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
982 |
fun trace_prop str = |
218
7ff7325e3b4e
started to adapt the rest of chapter 5 to the simplified version without parameters (they will be described in the extension section)
Christian Urban <urbanc@in.tum.de>
parents:
211
diff
changeset
|
983 |
LocalTheory.theory (fn lthy => (tracing str; lthy)) |
75 | 984 |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
985 |
val trace_prop_parser = OuterParse.prop >> trace_prop |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
986 |
val kind = OuterKeyword.thy_decl |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
987 |
in |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
988 |
OuterSyntax.local_theory "foobar" "traces a proposition" |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
989 |
kind trace_prop_parser |
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
990 |
end *} |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
991 |
|
218
7ff7325e3b4e
started to adapt the rest of chapter 5 to the simplified version without parameters (they will be described in the extension section)
Christian Urban <urbanc@in.tum.de>
parents:
211
diff
changeset
|
992 |
|
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
993 |
text {* |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
994 |
Now you can type |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
995 |
|
74 | 996 |
\begin{isabelle} |
997 |
\isacommand{foobar}~@{text [quotes] "True \<and> False"}\\ |
|
75 | 998 |
@{text "> \"True \<and> False\""} |
74 | 999 |
\end{isabelle} |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1000 |
|
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1001 |
and see the proposition in the tracing buffer. |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1002 |
|
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
1003 |
Note that so far we used @{ML_ind thy_decl in OuterKeyword} as the kind |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1004 |
indicator for the command. This means that the command finishes as soon as |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1005 |
the arguments are processed. Examples of this kind of commands are |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1006 |
\isacommand{definition} and \isacommand{declare}. In other cases, commands |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1007 |
are expected to parse some arguments, for example a proposition, and then |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1008 |
``open up'' a proof in order to prove the proposition (for example |
86 | 1009 |
\isacommand{lemma}) or prove some other properties (for example |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1010 |
\isacommand{function}). To achieve this kind of behaviour, you have to use |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
1011 |
the kind indicator @{ML_ind thy_goal in OuterKeyword} and the function @{ML |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1012 |
"local_theory_to_proof" in OuterSyntax} to set up the command. Note, |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1013 |
however, once you change the ``kind'' of a command from @{ML thy_decl in |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1014 |
OuterKeyword} to @{ML thy_goal in OuterKeyword} then the keyword file needs |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1015 |
to be re-created! |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1016 |
|
75 | 1017 |
Below we change \isacommand{foobar} so that it takes a proposition as |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1018 |
argument and then starts a proof in order to prove it. Therefore in Line 13, |
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1019 |
we set the kind indicator to @{ML thy_goal in OuterKeyword}. |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1020 |
*} |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1021 |
|
114
13fd0a83d3c3
properly handled linenumbers in ML-text and Isar-proofs
Christian Urban <urbanc@in.tum.de>
parents:
108
diff
changeset
|
1022 |
ML%linenosgray{*let |
241 | 1023 |
fun prove_prop str lthy = |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1024 |
let |
241 | 1025 |
val prop = Syntax.read_prop lthy str |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1026 |
in |
241 | 1027 |
Proof.theorem_i NONE (K I) [[(prop,[])]] lthy |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1028 |
end; |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1029 |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1030 |
val prove_prop_parser = OuterParse.prop >> prove_prop |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1031 |
val kind = OuterKeyword.thy_goal |
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1032 |
in |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1033 |
OuterSyntax.local_theory_to_proof "foobar" "proving a proposition" |
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1034 |
kind prove_prop_parser |
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1035 |
end *} |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1036 |
|
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1037 |
text {* |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1038 |
The function @{text prove_prop} in Lines 2 to 7 takes a string (the proposition to be |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1039 |
proved) and a context as argument. The context is necessary in order to be able to use |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
1040 |
@{ML_ind read_prop in Syntax}, which converts a string into a proper proposition. |
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
1041 |
In Line 6 the function @{ML_ind theorem_i in Proof} starts the proof for the |
75 | 1042 |
proposition. Its argument @{ML NONE} stands for a locale (which we chose to |
1043 |
omit); the argument @{ML "(K I)"} stands for a function that determines what |
|
1044 |
should be done with the theorem once it is proved (we chose to just forget |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1045 |
about it). Line 9 contains the parser for the proposition. |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1046 |
|
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1047 |
If you now type \isacommand{foobar}~@{text [quotes] "True \<and> True"}, you obtain the following |
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1048 |
proof state |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1049 |
|
74 | 1050 |
\begin{isabelle} |
80 | 1051 |
\isacommand{foobar}~@{text [quotes] "True \<and> True"}\\ |
102
5e309df58557
general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents:
101
diff
changeset
|
1052 |
@{text "goal (1 subgoal):"}\\ |
74 | 1053 |
@{text "1. True \<and> True"} |
1054 |
\end{isabelle} |
|
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1055 |
|
219
98d43270024f
more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents:
218
diff
changeset
|
1056 |
and you can build the following proof |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
1057 |
|
74 | 1058 |
\begin{isabelle} |
80 | 1059 |
\isacommand{foobar}~@{text [quotes] "True \<and> True"}\\ |
74 | 1060 |
\isacommand{apply}@{text "(rule conjI)"}\\ |
1061 |
\isacommand{apply}@{text "(rule TrueI)+"}\\ |
|
1062 |
\isacommand{done} |
|
1063 |
\end{isabelle} |
|
1064 |
||
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
1065 |
(FIXME: read a name and show how to store theorems; see @{ML_ind note in LocalTheory}) |
241 | 1066 |
|
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
1067 |
*} |
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
1068 |
|
211
d5accbc67e1b
more work on simple inductive and marked all sections that are still seriously incomplete with TBD
Christian Urban <urbanc@in.tum.de>
parents:
207
diff
changeset
|
1069 |
section {* Methods (TBD) *} |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1070 |
|
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1071 |
text {* |
207 | 1072 |
(FIXME: maybe move to after the tactic section) |
1073 |
||
221 | 1074 |
Methods are central to Isabelle. They are the ones you use for example |
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
1075 |
in \isacommand{apply}. To print out all currently known methods you can use the |
192 | 1076 |
Isabelle command: |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1077 |
|
207 | 1078 |
\begin{isabelle} |
1079 |
\isacommand{print\_methods}\\ |
|
1080 |
@{text "> methods:"}\\ |
|
1081 |
@{text "> -: do nothing (insert current facts only)"}\\ |
|
1082 |
@{text "> HOL.default: apply some intro/elim rule (potentially classical)"}\\ |
|
1083 |
@{text "> ..."} |
|
1084 |
\end{isabelle} |
|
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1085 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1086 |
An example of a very simple method is: |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1087 |
*} |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1088 |
|
244
dc95a56b1953
fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents:
241
diff
changeset
|
1089 |
method_setup %gray foo = |
181
5baaabe1ab92
updated to new method_setup
Christian Urban <urbanc@in.tum.de>
parents:
178
diff
changeset
|
1090 |
{* Scan.succeed |
5baaabe1ab92
updated to new method_setup
Christian Urban <urbanc@in.tum.de>
parents:
178
diff
changeset
|
1091 |
(K (SIMPLE_METHOD ((etac @{thm conjE} THEN' rtac @{thm conjI}) 1))) *} |
244
dc95a56b1953
fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents:
241
diff
changeset
|
1092 |
"foo method for conjE and conjI" |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1093 |
|
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1094 |
text {* |
286 | 1095 |
It defines the method @{text foo}, which takes no arguments (therefore the |
207 | 1096 |
parser @{ML Scan.succeed}) and only applies a single tactic, namely the tactic which |
256
1fb8d62c88a0
added some first index-information
Christian Urban <urbanc@in.tum.de>
parents:
250
diff
changeset
|
1097 |
applies @{thm [source] conjE} and then @{thm [source] conjI}. The function |
316
74f0a06f751f
further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents:
315
diff
changeset
|
1098 |
@{ML_ind SIMPLE_METHOD} |
287 | 1099 |
turns such a tactic into a method. The method @{text "foo"} can be used as follows |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1100 |
*} |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1101 |
|
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1102 |
lemma shows "A \<and> B \<Longrightarrow> C \<and> D" |
244
dc95a56b1953
fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents:
241
diff
changeset
|
1103 |
apply(foo) |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1104 |
txt {* |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1105 |
where it results in the goal state |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1106 |
|
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1107 |
\begin{minipage}{\textwidth} |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1108 |
@{subgoals} |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1109 |
\end{minipage} *} |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1110 |
(*<*)oops(*>*) |
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1111 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1112 |
|
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1113 |
(* |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1114 |
ML {* SIMPLE_METHOD *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1115 |
ML {* METHOD *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1116 |
ML {* K (SIMPLE_METHOD ((etac @{thm conjE} THEN' rtac @{thm conjI}) 1)) *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1117 |
ML {* Scan.succeed *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1118 |
*) |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1119 |
|
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
1120 |
text {* |
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
1121 |
(FIXME: explain a version of rule-tac) |
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
1122 |
*} |
178
fb8f22dd8ad0
adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents:
177
diff
changeset
|
1123 |
|
75 | 1124 |
(*<*) |
194 | 1125 |
(* THIS IS AN OLD VERSION OF THE PARSING CHAPTER BY JEREMY DAWSON *) |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
1126 |
chapter {* Parsing *} |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
1127 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
1128 |
text {* |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
1129 |
|
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1130 |
Lots of Standard ML code is given in this document, for various reasons, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1131 |
including: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1132 |
\begin{itemize} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1133 |
\item direct quotation of code found in the Isabelle source files, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1134 |
or simplified versions of such code |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1135 |
\item identifiers found in the Isabelle source code, with their types |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1136 |
(or specialisations of their types) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1137 |
\item code examples, which can be run by the reader, to help illustrate the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1138 |
behaviour of functions found in the Isabelle source code |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1139 |
\item ancillary functions, not from the Isabelle source code, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1140 |
which enable the reader to run relevant code examples |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1141 |
\item type abbreviations, which help explain the uses of certain functions |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1142 |
\end{itemize} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1143 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1144 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1145 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1146 |
section {* Parsing Isar input *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1147 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1148 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1149 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1150 |
The typical parsing function has the type |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1151 |
\texttt{'src -> 'res * 'src}, with input |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1152 |
of type \texttt{'src}, returning a result |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1153 |
of type \texttt{'res}, which is (or is derived from) the first part of the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1154 |
input, and also returning the remainder of the input. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1155 |
(In the common case, when it is clear what the ``remainder of the input'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1156 |
means, we will just say that the functions ``returns'' the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1157 |
value of type \texttt{'res}). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1158 |
An exception is raised if an appropriate value |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1159 |
cannot be produced from the input. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1160 |
A range of exceptions can be used to identify different reasons |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1161 |
for the failure of a parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1162 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1163 |
This contrasts the standard parsing function in Standard ML, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1164 |
which is of type |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1165 |
\texttt{type ('res, 'src) reader = 'src -> ('res * 'src) option}; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1166 |
(for example, \texttt{List.getItem} and \texttt{Substring.getc}). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1167 |
However, much of the discussion at |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1168 |
FIX file:/home/jeremy/html/ml/SMLBasis/string-cvt.html |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1169 |
is relevant. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1170 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1171 |
Naturally one may convert between the two different sorts of parsing functions |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1172 |
as follows: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1173 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1174 |
open StringCvt ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1175 |
type ('res, 'src) ex_reader = 'src -> 'res * 'src |
75 | 1176 |
ex_reader : ('res, 'src) reader -> ('res, 'src) ex_reader |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1177 |
fun ex_reader rdr src = Option.valOf (rdr src) ; |
75 | 1178 |
reader : ('res, 'src) ex_reader -> ('res, 'src) reader |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1179 |
fun reader exrdr src = SOME (exrdr src) handle _ => NONE ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1180 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1181 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1182 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1183 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1184 |
section{* The \texttt{Scan} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1185 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1186 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1187 |
The source file is \texttt{src/General/scan.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1188 |
This structure provides functions for using and combining parsing functions |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1189 |
of the type \texttt{'src -> 'res * 'src}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1190 |
Three exceptions are used: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1191 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1192 |
exception MORE of string option; (*need more input (prompt)*) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1193 |
exception FAIL of string option; (*try alternatives (reason of failure)*) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1194 |
exception ABORT of string; (*dead end*) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1195 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1196 |
Many functions in this structure (generally those with names composed of |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1197 |
symbols) are declared as infix. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1198 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1199 |
Some functions from that structure are |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1200 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1201 |
|-- : ('src -> 'res1 * 'src') * ('src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1202 |
'src -> 'res2 * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1203 |
--| : ('src -> 'res1 * 'src') * ('src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1204 |
'src -> 'res1 * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1205 |
-- : ('src -> 'res1 * 'src') * ('src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1206 |
'src -> ('res1 * 'res2) * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1207 |
^^ : ('src -> string * 'src') * ('src' -> string * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1208 |
'src -> string * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1209 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1210 |
These functions parse a result off the input source twice. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1211 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1212 |
\texttt{|--} and \texttt{--|} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1213 |
return the first result and the second result, respectively. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1214 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1215 |
\texttt{--} returns both. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1216 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1217 |
\verb|^^| returns the result of concatenating the two results |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1218 |
(which must be strings). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1219 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1220 |
Note how, although the types |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1221 |
\texttt{'src}, \texttt{'src'} and \texttt{'src''} will normally be the same, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1222 |
the types as shown help suggest the behaviour of the functions. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1223 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1224 |
:-- : ('src -> 'res1 * 'src') * ('res1 -> 'src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1225 |
'src -> ('res1 * 'res2) * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1226 |
:|-- : ('src -> 'res1 * 'src') * ('res1 -> 'src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1227 |
'src -> 'res2 * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1228 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1229 |
These are similar to \texttt{|--} and \texttt{--|}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1230 |
except that the second parsing function can depend on the result of the first. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1231 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1232 |
>> : ('src -> 'res1 * 'src') * ('res1 -> 'res2) -> 'src -> 'res2 * 'src' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1233 |
|| : ('src -> 'res_src) * ('src -> 'res_src) -> 'src -> 'res_src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1234 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1235 |
\texttt{p >> f} applies a function \texttt{f} to the result of a parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1236 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1237 |
\texttt{||} tries a second parsing function if the first one |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1238 |
fails by raising an exception of the form \texttt{FAIL \_}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1239 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1240 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1241 |
succeed : 'res -> ('src -> 'res * 'src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1242 |
fail : ('src -> 'res_src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1243 |
!! : ('src * string option -> string) -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1244 |
('src -> 'res_src) -> ('src -> 'res_src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1245 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1246 |
\texttt{succeed r} returns \texttt{r}, with the input unchanged. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1247 |
\texttt{fail} always fails, raising exception \texttt{FAIL NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1248 |
\texttt{!! f} only affects the failure mode, turning a failure that |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1249 |
raises \texttt{FAIL \_} into a failure that raises \texttt{ABORT ...}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1250 |
This is used to prevent recovery from the failure --- |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1251 |
thus, in \texttt{!! parse1 || parse2}, if \texttt{parse1} fails, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1252 |
it won't recover by trying \texttt{parse2}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1253 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1254 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1255 |
one : ('si -> bool) -> ('si list -> 'si * 'si list) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1256 |
some : ('si -> 'res option) -> ('si list -> 'res * 'si list) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1257 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1258 |
These require the input to be a list of items: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1259 |
they fail, raising \texttt{MORE NONE} if the list is empty. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1260 |
On other failures they raise \texttt{FAIL NONE} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1261 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1262 |
\texttt{one p} takes the first |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1263 |
item from the list if it satisfies \texttt{p}, otherwise fails. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1264 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1265 |
\texttt{some f} takes the first |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1266 |
item from the list and applies \texttt{f} to it, failing if this returns |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1267 |
\texttt{NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1268 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1269 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1270 |
many : ('si -> bool) -> 'si list -> 'si list * 'si list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1271 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1272 |
\texttt{many p} takes items from the input until it encounters one |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1273 |
which does not satisfy \texttt{p}. If it reaches the end of the input |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1274 |
it fails, raising \texttt{MORE NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1275 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1276 |
\texttt{many1} (with the same type) fails if the first item |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1277 |
does not satisfy \texttt{p}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1278 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1279 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1280 |
option : ('src -> 'res * 'src) -> ('src -> 'res option * 'src) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1281 |
optional : ('src -> 'res * 'src) -> 'res -> ('src -> 'res * 'src) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1282 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1283 |
\texttt{option}: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1284 |
where the parser \texttt{f} succeeds with result \texttt{r} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1285 |
or raises \texttt{FAIL \_}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1286 |
\texttt{option f} gives the result \texttt{SOME r} or \texttt{NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1287 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1288 |
\texttt{optional}: if parser \texttt{f} fails by raising \texttt{FAIL \_}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1289 |
\texttt{optional f default} provides the result \texttt{default}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1290 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1291 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1292 |
repeat : ('src -> 'res * 'src) -> 'src -> 'res list * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1293 |
repeat1 : ('src -> 'res * 'src) -> 'src -> 'res list * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1294 |
bulk : ('src -> 'res * 'src) -> 'src -> 'res list * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1295 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1296 |
\texttt{repeat f} repeatedly parses an item off the remaining input until |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1297 |
\texttt{f} fails with \texttt{FAIL \_} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1298 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1299 |
\texttt{repeat1} is as for \texttt{repeat}, but requires at least one |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1300 |
successful parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1301 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1302 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1303 |
lift : ('src -> 'res * 'src) -> ('ex * 'src -> 'res * ('ex * 'src)) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1304 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1305 |
\texttt{lift} changes the source type of a parser by putting in an extra |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1306 |
component \texttt{'ex}, which is ignored in the parsing. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1307 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1308 |
The \texttt{Scan} structure also provides the type \texttt{lexicon}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1309 |
HOW DO THEY WORK ?? TO BE COMPLETED |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1310 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1311 |
dest_lexicon: lexicon -> string list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1312 |
make_lexicon: string list list -> lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1313 |
empty_lexicon: lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1314 |
extend_lexicon: string list list -> lexicon -> lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1315 |
merge_lexicons: lexicon -> lexicon -> lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1316 |
is_literal: lexicon -> string list -> bool ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1317 |
literal: lexicon -> string list -> string list * string list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1318 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1319 |
Two lexicons, for the commands and keywords, are stored and can be retrieved |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1320 |
by: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1321 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1322 |
val (command_lexicon, keyword_lexicon) = OuterSyntax.get_lexicons () ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1323 |
val commands = Scan.dest_lexicon command_lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1324 |
val keywords = Scan.dest_lexicon keyword_lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1325 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1326 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1327 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1328 |
section{* The \texttt{OuterLex} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1329 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1330 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1331 |
The source file is @{text "src/Pure/Isar/outer_lex.ML"}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1332 |
In some other source files its name is abbreviated: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1333 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1334 |
structure T = OuterLex; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1335 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1336 |
This structure defines the type \texttt{token}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1337 |
(The types |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1338 |
\texttt{OuterLex.token}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1339 |
\texttt{OuterParse.token} and |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1340 |
\texttt{SpecParse.token} are all the same). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1341 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1342 |
Input text is split up into tokens, and the input source type for many parsing |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1343 |
functions is \texttt{token list}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1344 |
|
250
ab9e09076462
some polishing; added together with Jasmin more examples to the pretty printing section
Christian Urban <urbanc@in.tum.de>
parents:
244
diff
changeset
|
1345 |
The datatype definition (which is not published in the signature) is |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1346 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1347 |
datatype token = Token of Position.T * (token_kind * string); |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1348 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1349 |
but here are some runnable examples for viewing tokens: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1350 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1351 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1352 |
|
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1353 |
|
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1354 |
|
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1355 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1356 |
ML{* |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1357 |
val toks = OuterSyntax.scan Position.none |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1358 |
"theory,imports;begin x.y.z apply ?v1 ?'a 'a -- || 44 simp (* xx *) { * fff * }" ; |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1359 |
*} |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1360 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1361 |
ML{* |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1362 |
print_depth 20 ; |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1363 |
*} |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1364 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1365 |
ML{* |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1366 |
map OuterLex.text_of toks ; |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1367 |
*} |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1368 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1369 |
ML{* |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1370 |
val proper_toks = filter OuterLex.is_proper toks ; |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1371 |
*} |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1372 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1373 |
ML{* |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1374 |
map OuterLex.kind_of proper_toks |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1375 |
*} |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1376 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1377 |
ML{* |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1378 |
map OuterLex.unparse proper_toks ; |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1379 |
*} |
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1380 |
|
69
19106a9975c1
highligted the background of ML-code
Christian Urban <urbanc@in.tum.de>
parents:
68
diff
changeset
|
1381 |
ML{* |
47
4daf913fdbe1
hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents:
44
diff
changeset
|
1382 |
OuterLex.stopper |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1383 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1384 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1385 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1386 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1387 |
The function \texttt{is\_proper : token -> bool} identifies tokens which are |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1388 |
not white space or comments: many parsing functions assume require spaces or |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1389 |
comments to have been filtered out. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1390 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1391 |
There is a special end-of-file token: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1392 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1393 |
val (tok_eof : token, is_eof : token -> bool) = T.stopper ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1394 |
(* end of file token *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1395 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1396 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1397 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1398 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1399 |
section {* The \texttt{OuterParse} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1400 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1401 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1402 |
The source file is \texttt{src/Pure/Isar/outer\_parse.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1403 |
In some other source files its name is abbreviated: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1404 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1405 |
structure P = OuterParse; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1406 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1407 |
Here the parsers use \texttt{token list} as the input source type. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1408 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1409 |
Some of the parsers simply select the first token, provided that it is of the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1410 |
right kind (as returned by \texttt{T.kind\_of}): these are |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1411 |
\texttt{ command, keyword, short\_ident, long\_ident, sym\_ident, term\_var, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1412 |
type\_ident, type\_var, number, string, alt\_string, verbatim, sync, eof} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1413 |
Others select the first token, provided that it is one of several kinds, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1414 |
(eg, \texttt{name, xname, text, typ}). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1415 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1416 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1417 |
type 'a tlp = token list -> 'a * token list ; (* token list parser *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1418 |
$$$ : string -> string tlp |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1419 |
nat : int tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1420 |
maybe : 'a tlp -> 'a option tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1421 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1422 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1423 |
\texttt{\$\$\$ s} returns the first token, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1424 |
if it equals \texttt{s} \emph{and} \texttt{s} is a keyword. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1425 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1426 |
\texttt{nat} returns the first token, if it is a number, and evaluates it. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1427 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1428 |
\texttt{maybe}: if \texttt{p} returns \texttt{r}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1429 |
then \texttt{maybe p} returns \texttt{SOME r} ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1430 |
if the first token is an underscore, it returns \texttt{NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1431 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1432 |
A few examples: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1433 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1434 |
P.list : 'a tlp -> 'a list tlp ; (* likewise P.list1 *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1435 |
P.and_list : 'a tlp -> 'a list tlp ; (* likewise P.and_list1 *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1436 |
val toks : token list = OuterSyntax.scan "44 ,_, 66,77" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1437 |
val proper_toks = List.filter T.is_proper toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1438 |
P.list P.nat toks ; (* OK, doesn't recognize white space *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1439 |
P.list P.nat proper_toks ; (* fails, doesn't recognize what follows ',' *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1440 |
P.list (P.maybe P.nat) proper_toks ; (* fails, end of input *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1441 |
P.list (P.maybe P.nat) (proper_toks @ [tok_eof]) ; (* OK *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1442 |
val toks : token list = OuterSyntax.scan "44 and 55 and 66 and 77" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1443 |
P.and_list P.nat (List.filter T.is_proper toks @ [tok_eof]) ; (* ??? *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1444 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1445 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1446 |
The following code helps run examples: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1447 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1448 |
fun parse_str tlp str = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1449 |
let val toks : token list = OuterSyntax.scan str ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1450 |
val proper_toks = List.filter T.is_proper toks @ [tok_eof] ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1451 |
val (res, rem_toks) = tlp proper_toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1452 |
val rem_str = String.concat |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1453 |
(Library.separate " " (List.map T.unparse rem_toks)) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1454 |
in (res, rem_str) end ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1455 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1456 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1457 |
Some examples from \texttt{src/Pure/Isar/outer\_parse.ML} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1458 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1459 |
val type_args = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1460 |
type_ident >> Library.single || |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1461 |
$$$ "(" |-- !!! (list1 type_ident --| $$$ ")") || |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1462 |
Scan.succeed []; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1463 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1464 |
There are three ways parsing a list of type arguments can succeed. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1465 |
The first line reads a single type argument, and turns it into a singleton |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1466 |
list. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1467 |
The second line reads "(", and then the remainder, ignoring the "(" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1468 |
the remainder consists of a list of type identifiers (at least one), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1469 |
and then a ")" which is also ignored. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1470 |
The \texttt{!!!} ensures that if the parsing proceeds this far and then fails, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1471 |
it won't try the third line (see the description of \texttt{Scan.!!}). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1472 |
The third line consumes no input and returns the empty list. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1473 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1474 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1475 |
fun triple2 (x, (y, z)) = (x, y, z); |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1476 |
val arity = xname -- ($$$ "::" |-- !!! ( |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1477 |
Scan.optional ($$$ "(" |-- !!! (list1 sort --| $$$ ")")) [] |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1478 |
-- sort)) >> triple2; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1479 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1480 |
The parser \texttt{arity} reads a typename $t$, then ``\texttt{::}'' (which is |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1481 |
ignored), then optionally a list $ss$ of sorts and then another sort $s$. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1482 |
The result $(t, (ss, s))$ is transformed by \texttt{triple2} to $(t, ss, s)$. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1483 |
The second line reads the optional list of sorts: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1484 |
it reads first ``\texttt{(}'' and last ``\texttt{)}'', which are both ignored, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1485 |
and between them a comma-separated list of sorts. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1486 |
If this list is absent, the default \texttt{[]} provides the list of sorts. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1487 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1488 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1489 |
parse_str P.type_args "('a, 'b) ntyp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1490 |
parse_str P.type_args "'a ntyp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1491 |
parse_str P.type_args "ntyp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1492 |
parse_str P.arity "ty :: tycl" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1493 |
parse_str P.arity "ty :: (tycl1, tycl2) tycl" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1494 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1495 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1496 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1497 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1498 |
section {* The \texttt{SpecParse} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1499 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1500 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1501 |
The source file is \texttt{src/Pure/Isar/spec\_parse.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1502 |
This structure contains token list parsers for more complicated values. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1503 |
For example, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1504 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1505 |
open SpecParse ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1506 |
attrib : Attrib.src tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1507 |
attribs : Attrib.src list tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1508 |
opt_attribs : Attrib.src list tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1509 |
xthm : (thmref * Attrib.src list) tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1510 |
xthms1 : (thmref * Attrib.src list) list tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1511 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1512 |
parse_str attrib "simp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1513 |
parse_str opt_attribs "hello" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1514 |
val (ass, "") = parse_str attribs "[standard, xxxx, simp, intro, OF sym]" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1515 |
map Args.dest_src ass ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1516 |
val (asrc, "") = parse_str attrib "THEN trans [THEN sym]" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1517 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1518 |
parse_str xthm "mythm [attr]" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1519 |
parse_str xthms1 "thm1 [attr] thms2" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1520 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1521 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1522 |
As you can see, attributes are described using types of the \texttt{Args} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1523 |
structure, described below. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1524 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1525 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1526 |
section{* The \texttt{Args} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1527 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1528 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1529 |
The source file is \texttt{src/Pure/Isar/args.ML}. |
250
ab9e09076462
some polishing; added together with Jasmin more examples to the pretty printing section
Christian Urban <urbanc@in.tum.de>
parents:
244
diff
changeset
|
1530 |
The primary type of this structure is the \texttt{src} datatype; |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1531 |
the single constructors not published in the signature, but |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1532 |
\texttt{Args.src} and \texttt{Args.dest\_src} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1533 |
are in fact the constructor and destructor functions. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1534 |
Note that the types \texttt{Attrib.src} and \texttt{Method.src} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1535 |
are in fact \texttt{Args.src}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1536 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1537 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1538 |
src : (string * Args.T list) * Position.T -> Args.src ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1539 |
dest_src : Args.src -> (string * Args.T list) * Position.T ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1540 |
Args.pretty_src : Proof.context -> Args.src -> Pretty.T ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1541 |
fun pr_src ctxt src = Pretty.string_of (Args.pretty_src ctxt src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1542 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1543 |
val thy = ML_Context.the_context () ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1544 |
val ctxt = ProofContext.init thy ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1545 |
map (pr_src ctxt) ass ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1546 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1547 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1548 |
So an \texttt{Args.src} consists of the first word, then a list of further |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1549 |
``arguments'', of type \texttt{Args.T}, with information about position in the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1550 |
input. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1551 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1552 |
(* how an Args.src is parsed *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1553 |
P.position : 'a tlp -> ('a * Position.T) tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1554 |
P.arguments : Args.T list tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1555 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1556 |
val parse_src : Args.src tlp = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1557 |
P.position (P.xname -- P.arguments) >> Args.src ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1558 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1559 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1560 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1561 |
val ((first_word, args), pos) = Args.dest_src asrc ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1562 |
map Args.string_of args ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1563 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1564 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1565 |
The \texttt{Args} structure contains more parsers and parser transformers |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1566 |
for which the input source type is \texttt{Args.T list}. For example, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1567 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1568 |
type 'a atlp = Args.T list -> 'a * Args.T list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1569 |
open Args ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1570 |
nat : int atlp ; (* also Args.int *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1571 |
thm_sel : PureThy.interval list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1572 |
list : 'a atlp -> 'a list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1573 |
attribs : (string -> string) -> Args.src list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1574 |
opt_attribs : (string -> string) -> Args.src list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1575 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1576 |
(* parse_atl_str : 'a atlp -> (string -> 'a * string) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1577 |
given an Args.T list parser, to get a string parser *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1578 |
fun parse_atl_str atlp str = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1579 |
let val (ats, rem_str) = parse_str P.arguments str ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1580 |
val (res, rem_ats) = atlp ats ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1581 |
in (res, String.concat (Library.separate " " |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1582 |
(List.map Args.string_of rem_ats @ [rem_str]))) end ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1583 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1584 |
parse_atl_str Args.int "-1-," ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1585 |
parse_atl_str (Scan.option Args.int) "x1-," ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1586 |
parse_atl_str Args.thm_sel "(1-,4,13-22)" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1587 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1588 |
val (ats as atsrc :: _, "") = parse_atl_str (Args.attribs I) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1589 |
"[THEN trans [THEN sym], simp, OF sym]" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1590 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1591 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1592 |
From here, an attribute is interpreted using \texttt{Attrib.attribute}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1593 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1594 |
\texttt{Args} has a large number of functions which parse an \texttt{Args.src} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1595 |
and also refer to a generic context. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1596 |
Note the use of \texttt{Scan.lift} for this. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1597 |
(as does \texttt{Attrib} - RETHINK THIS) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1598 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1599 |
(\texttt{Args.syntax} shown below has type specialised) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1600 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1601 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1602 |
type ('res, 'src) parse_fn = 'src -> 'res * 'src ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1603 |
type 'a cgatlp = ('a, Context.generic * Args.T list) parse_fn ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1604 |
Scan.lift : 'a atlp -> 'a cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1605 |
term : term cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1606 |
typ : typ cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1607 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1608 |
Args.syntax : string -> 'res cgatlp -> src -> ('res, Context.generic) parse_fn ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1609 |
Attrib.thm : thm cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1610 |
Attrib.thms : thm list cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1611 |
Attrib.multi_thm : thm list cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1612 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1613 |
(* parse_cgatl_str : 'a cgatlp -> (string -> 'a * string) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1614 |
given a (Context.generic * Args.T list) parser, to get a string parser *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1615 |
fun parse_cgatl_str cgatlp str = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1616 |
let |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1617 |
(* use the current generic context *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1618 |
val generic = Context.Theory thy ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1619 |
val (ats, rem_str) = parse_str P.arguments str ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1620 |
(* ignore any change to the generic context *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1621 |
val (res, (_, rem_ats)) = cgatlp (generic, ats) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1622 |
in (res, String.concat (Library.separate " " |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1623 |
(List.map Args.string_of rem_ats @ [rem_str]))) end ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1624 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1625 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1626 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1627 |
section{* Attributes, and the \texttt{Attrib} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1628 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1629 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1630 |
The type \texttt{attribute} is declared in \texttt{src/Pure/thm.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1631 |
The source file for the \texttt{Attrib} structure is |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1632 |
\texttt{src/Pure/Isar/attrib.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1633 |
Most attributes use a theorem to change a generic context (for example, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1634 |
by declaring that the theorem should be used, by default, in simplification), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1635 |
or change a theorem (which most often involves referring to the current |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1636 |
theory). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1637 |
The functions \texttt{Thm.rule\_attribute} and |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1638 |
\texttt{Thm.declaration\_attribute} create attributes of these kinds. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1639 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1640 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1641 |
type attribute = Context.generic * thm -> Context.generic * thm; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1642 |
type 'a trf = 'a -> 'a ; (* transformer of a given type *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1643 |
Thm.rule_attribute : (Context.generic -> thm -> thm) -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1644 |
Thm.declaration_attribute : (thm -> Context.generic trf) -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1645 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1646 |
Attrib.print_attributes : theory -> unit ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1647 |
Attrib.pretty_attribs : Proof.context -> src list -> Pretty.T list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1648 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1649 |
List.app Pretty.writeln (Attrib.pretty_attribs ctxt ass) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1650 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1651 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1652 |
An attribute is stored in a theory as indicated by: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1653 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1654 |
Attrib.add_attributes : |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1655 |
(bstring * (src -> attribute) * string) list -> theory trf ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1656 |
(* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1657 |
Attrib.add_attributes [("THEN", THEN_att, "resolution with rule")] ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1658 |
*) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1659 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1660 |
where the first and third arguments are name and description of the attribute, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1661 |
and the second is a function which parses the attribute input text |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1662 |
(including the attribute name, which has necessarily already been parsed). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1663 |
Here, \texttt{THEN\_att} is a function declared in the code for the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1664 |
structure \texttt{Attrib}, but not published in its signature. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1665 |
The source file \texttt{src/Pure/Isar/attrib.ML} shows the use of |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1666 |
\texttt{Attrib.add\_attributes} to add a number of attributes. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1667 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1668 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1669 |
FullAttrib.THEN_att : src -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1670 |
FullAttrib.THEN_att atsrc (generic, ML_Context.thm "sym") ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1671 |
FullAttrib.THEN_att atsrc (generic, ML_Context.thm "all_comm") ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1672 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1673 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1674 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1675 |
Attrib.syntax : attribute cgatlp -> src -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1676 |
Attrib.no_args : attribute -> src -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1677 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1678 |
When this is called as \texttt{syntax scan src (gc, th)} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1679 |
the generic context \texttt{gc} is used |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1680 |
(and potentially changed to \texttt{gc'}) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1681 |
by \texttt{scan} in parsing to obtain an attribute \texttt{attr} which would |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1682 |
then be applied to \texttt{(gc', th)}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1683 |
The source for parsing the attribute is the arguments part of \texttt{src}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1684 |
which must all be consumed by the parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1685 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1686 |
For example, for \texttt{Attrib.no\_args attr src}, the attribute parser |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1687 |
simply returns \texttt{attr}, requiring that the arguments part of |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1688 |
\texttt{src} must be empty. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1689 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1690 |
Some examples from \texttt{src/Pure/Isar/attrib.ML}, modified: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1691 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1692 |
fun rot_att_n n (gc, th) = (gc, rotate_prems n th) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1693 |
rot_att_n : int -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1694 |
val rot_arg = Scan.lift (Scan.optional Args.int 1 : int atlp) : int cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1695 |
val rotated_att : src -> attribute = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1696 |
Attrib.syntax (rot_arg >> rot_att_n : attribute cgatlp) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1697 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1698 |
val THEN_arg : int cgatlp = Scan.lift |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1699 |
(Scan.optional (Args.bracks Args.nat : int atlp) 1 : int atlp) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1700 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1701 |
Attrib.thm : thm cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1702 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1703 |
THEN_arg -- Attrib.thm : (int * thm) cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1704 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1705 |
fun THEN_att_n (n, tht) (gc, th) = (gc, th RSN (n, tht)) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1706 |
THEN_att_n : int * thm -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1707 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1708 |
val THEN_att : src -> attribute = Attrib.syntax |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1709 |
(THEN_arg -- Attrib.thm >> THEN_att_n : attribute cgatlp); |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1710 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1711 |
The functions I've called \texttt{rot\_arg} and \texttt{THEN\_arg} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1712 |
read an optional argument, which for \texttt{rotated} is an integer, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1713 |
and for \texttt{THEN} is a natural enclosed in square brackets; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1714 |
the default, if the argument is absent, is 1 in each case. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1715 |
Functions \texttt{rot\_att\_n} and \texttt{THEN\_att\_n} turn these into |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1716 |
attributes, where \texttt{THEN\_att\_n} also requires a theorem, which is |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1717 |
parsed by \texttt{Attrib.thm}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1718 |
Infix operators \texttt{--} and \texttt{>>} are in the structure \texttt{Scan}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1719 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1720 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1721 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1722 |
section{* Methods, and the \texttt{Method} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1723 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1724 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1725 |
The source file is \texttt{src/Pure/Isar/method.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1726 |
The type \texttt{method} is defined by the datatype declaration |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1727 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1728 |
(* datatype method = Meth of thm list -> cases_tactic; *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1729 |
RuleCases.NO_CASES : tactic -> cases_tactic ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1730 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1731 |
In fact \texttt{RAW\_METHOD\_CASES} (below) is exactly the constructor |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1732 |
\texttt{Meth}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1733 |
A \texttt{cases\_tactic} is an elaborated version of a tactic. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1734 |
\texttt{NO\_CASES tac} is a \texttt{cases\_tactic} which consists of a |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1735 |
\texttt{cases\_tactic} without any further case information. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1736 |
For further details see the description of structure \texttt{RuleCases} below. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1737 |
The list of theorems to be passed to a method consists of the current |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1738 |
\emph{facts} in the proof. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1739 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1740 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1741 |
RAW_METHOD : (thm list -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1742 |
METHOD : (thm list -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1743 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1744 |
SIMPLE_METHOD : tactic -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1745 |
SIMPLE_METHOD' : (int -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1746 |
SIMPLE_METHOD'' : ((int -> tactic) -> tactic) -> (int -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1747 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1748 |
RAW_METHOD_CASES : (thm list -> cases_tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1749 |
METHOD_CASES : (thm list -> cases_tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1750 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1751 |
A method is, in its simplest form, a tactic; applying the method is to apply |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1752 |
the tactic to the current goal state. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1753 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1754 |
Applying \texttt{RAW\_METHOD tacf} creates a tactic by applying |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1755 |
\texttt{tacf} to the current {facts}, and applying that tactic to the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1756 |
goal state. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1757 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1758 |
\texttt{METHOD} is similar but also first applies |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1759 |
\texttt{Goal.conjunction\_tac} to all subgoals. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1760 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1761 |
\texttt{SIMPLE\_METHOD tac} inserts the facts into all subgoals and then |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1762 |
applies \texttt{tacf}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1763 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1764 |
\texttt{SIMPLE\_METHOD' tacf} inserts the facts and then |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1765 |
applies \texttt{tacf} to subgoal 1. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1766 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1767 |
\texttt{SIMPLE\_METHOD'' quant tacf} does this for subgoal(s) selected by |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1768 |
\texttt{quant}, which may be, for example, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1769 |
\texttt{ALLGOALS} (all subgoals), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1770 |
\texttt{TRYALL} (try all subgoals, failure is OK), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1771 |
\texttt{FIRSTGOAL} (try subgoals until it succeeds once), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1772 |
\texttt{(fn tacf => tacf 4)} (subgoal 4), etc |
16 | 1773 |
(see the \texttt{Tactical} structure, FIXME) %%\cite[Chapter 4]{ref}). |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1774 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1775 |
A method is stored in a theory as indicated by: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1776 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1777 |
Method.add_method : |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1778 |
(bstring * (src -> Proof.context -> method) * string) -> theory trf ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1779 |
( * |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1780 |
* ) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1781 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1782 |
where the first and third arguments are name and description of the method, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1783 |
and the second is a function which parses the method input text |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1784 |
(including the method name, which has necessarily already been parsed). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1785 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1786 |
Here, \texttt{xxx} is a function declared in the code for the |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1787 |
structure \texttt{Method}, but not published in its signature. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1788 |
The source file \texttt{src/Pure/Isar/method.ML} shows the use of |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1789 |
\texttt{Method.add\_method} to add a number of methods. |
240
d111f5988e49
replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents:
236
diff
changeset
|
1790 |
*} |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1791 |
|
75 | 1792 |
(*>*) |
220 | 1793 |
end |