author | Christian Urban <urbanc@in.tum.de> |
Wed, 29 Oct 2008 13:58:36 +0100 | |
changeset 43 | 02f76f1b6e7b |
parent 42 | cd612b489504 |
child 44 | dee4b3e66dfe |
permissions | -rw-r--r-- |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1 |
theory Parsing |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
2 |
imports Base |
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
3 |
|
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 |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
6 |
|
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
7 |
chapter {* Parsing *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
8 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
9 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
10 |
|
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
11 |
Isabelle distinguishes between \emph{outer} and \emph{inner} syntax. |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
12 |
Theory commands, such as \isacommand{definition}, \isacommand{inductive} and so |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
13 |
on, belong to the outer syntax, whereas items inside double quotation marks, such |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
14 |
as terms, types and so on, belong to the inner syntax. For parsing inner syntax, |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
15 |
Isabelle uses a rather general and sophisticated algorithm due to Earley, which |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
16 |
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
|
17 |
parsing combinators. These combinators are a well-established technique for parsing, |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
18 |
which has, for example, been described in Paulson's classic book \cite{paulson-ml2}. |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
19 |
Isabelle developers are usually concerned with writing these outer syntax parsers, |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
20 |
either for new definitional packages or for calling tactics with specific arguments. |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
21 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
22 |
\begin{readmore} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
23 |
The library |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
24 |
for writing parser combinators can be split up, roughly, into two parts. |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
25 |
The first part consists of a collection of generic parser combinators defined |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
26 |
in the structure @{ML_struct Scan} in the file |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
27 |
@{ML_file "Pure/General/scan.ML"}. The second part of the library consists of |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
28 |
combinators for dealing with specific token types, which are defined in the |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
29 |
structure @{ML_struct OuterParse} in the file |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
30 |
@{ML_file "Pure/Isar/outer_parse.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 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
35 |
section {* Building Up Generic Parsers *} |
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 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
39 |
Let us first have a look at parsing strings using generic parsing combinators. |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
40 |
The function @{ML "(op $$)"} takes a string and will ``consume'' this string from |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
41 |
a given input list of strings. ``Consume'' in this context means that it will |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
42 |
return a pair consisting of this string and the rest of the input list. |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
43 |
For example: |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
44 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
45 |
@{ML_response [display] "($$ \"h\") (explode \"hello\")" "(\"h\", [\"e\", \"l\", \"l\", \"o\"])"} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
46 |
@{ML_response [display] "($$ \"w\") (explode \"world\")" "(\"w\", [\"o\", \"r\", \"l\", \"d\"])"} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
47 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
48 |
This function will either succeed (as in the two examples above) or raise the exeption |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
49 |
@{ML_text "FAIL"} if no string can be consumed. For example trying to parse |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
50 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
51 |
@{ML_response_fake [display] "($$ \"x\") (explode \"world\")" |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
52 |
"Exception FAIL raised"} |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
53 |
|
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
54 |
will raise the exception @{ML_text "FAIL"}. |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
55 |
There are three exceptions used in the parsing combinators: |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
56 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
57 |
\begin{itemize} |
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 |
\item @{ML_text "FAIL"} is used to indicate that alternative routes of parsing |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
59 |
might be explored. |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
60 |
\item @{ML_text "MORE"} indicates that there is not enough input for the parser. For example |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
61 |
in @{ML_text "($$ \"h\") []"}. |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
62 |
\item @{ML_text "ABORT"} is the exception which is raised when a dead end is reached. |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
63 |
It is used for example in the function @{ML "(op !!)"} (see below). |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
64 |
\end{itemize} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
65 |
|
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
|
66 |
(FIXME: do the exception need to be explained, because the user cannot use them from ``outside''?) |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
67 |
|
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
68 |
Slightly more general than the parser @{ML "(op $$)"} is the function @{ML Scan.one}, in that it |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
69 |
takes a predicate as argument and then parses exactly one item from the input list |
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
|
70 |
satisfying this prediate. For example the following parser either consumes an |
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
|
71 |
@{ML_text [quotes] "h"} or a @{ML_text [quotes] "w"}: |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
72 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
73 |
@{ML_response [display] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
74 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
75 |
val hw = Scan.one (fn x => x = \"h\" orelse x = \"w\") |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
76 |
val input1 = (explode \"hello\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
77 |
val input2 = (explode \"world\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
78 |
in |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
79 |
(hw input1, hw input2) |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
80 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
81 |
"((\"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
|
82 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
83 |
Two parser can be connected in sequence by using the funtion @{ML "(op --)"}. |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
84 |
For example parsing @{ML_text "h"}, @{ML_text "e"} and @{ML_text "l"} in this |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
85 |
sequence can be achieved by |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
86 |
|
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
87 |
@{ML_response [display] "(($$ \"h\") -- ($$ \"e\") -- ($$ \"l\")) (explode \"hello\")" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
88 |
"(((\"h\", \"e\"), \"l\"), [\"l\", \"o\"])"} |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
89 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
90 |
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
|
91 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
92 |
Parsers that explore |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
93 |
alternatives can be constructed using the function @{ML "(op ||)"}. For example, the |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
94 |
parser @{ML_open "(p || q)" for p q} returns the result of @{ML_text "p"}, in case it succeeds, |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
95 |
otherwise it returns the result of @{ML_text "q"}. For example |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
96 |
|
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
97 |
@{ML_response [display] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
98 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
99 |
val hw = ($$ \"h\") || ($$ \"w\") |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
100 |
val input1 = (explode \"hello\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
101 |
val input2 = (explode \"world\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
102 |
in |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
103 |
(hw input1, hw input2) |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
104 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
105 |
"((\"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
|
106 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
107 |
The functions @{ML "(op |--)"} and @{ML "(op --|)"} work like the sequencing funtion |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
108 |
for parsers, except that they discard the item parsed by the first (respectively second) |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
109 |
parser. For example |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
110 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
111 |
@{ML_response [display] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
112 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
113 |
val just_h = ($$ \"h\") |-- ($$ \"e\") |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
114 |
val just_e = ($$ \"h\") --| ($$ \"e\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
115 |
val input = (explode \"hello\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
116 |
in |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
117 |
(just_h input, just_e input) |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
118 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
119 |
"((\"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
|
120 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
121 |
The parser @{ML_open "Scan.optional p x" for p x} returns the result of the parser |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
122 |
@{ML_text "p"}, if it succeeds; otherwise it returns |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
123 |
the default value @{ML_text "x"}. For example |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
124 |
|
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
125 |
@{ML_response [display] |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
126 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
127 |
val p = Scan.optional ($$ \"h\") \"x\" |
39
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
128 |
val input1 = (explode \"hello\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
129 |
val input2 = (explode \"world\") |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
130 |
in |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
131 |
(p input1, p input2) |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
132 |
end" |
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
133 |
"((\"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
|
134 |
|
631d12c25bde
substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents:
38
diff
changeset
|
135 |
The function @{ML "(op !!)"} helps to produce appropriate error messages |
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
|
136 |
during parsing. For example if one wants to parse that @{ML_text p} is immediately |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
137 |
followed by @{ML_text q}, or start a completely different parser @{ML_text r}, |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
138 |
one might write |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
139 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
140 |
@{ML_open [display] "(p -- q) || r" for p q r} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
141 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
142 |
However, this parser is problematic for producing an appropriate error message, in case |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
143 |
the parsing of @{ML_open "(p -- q)" for p q} fails. Because in that case one loses with the parser |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
144 |
above the information |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
145 |
that @{ML_text p} should be followed by @{ML_text q}. To see this consider the case in |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
146 |
which @{ML_text p} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
147 |
is present in the input, but not @{ML_text q}. That means @{ML_open "(p -- q)" for p q} will fail |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
148 |
and the |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
149 |
alternative parser @{ML_text r} will be tried. However in many circumstanes this will be the wrong |
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
|
150 |
parser for the input ``p-followed-by-q'' and therefore will also fail. The error message is then |
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
|
151 |
caused by the |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
152 |
failure of @{ML_text r}, not by the absense of @{ML_text q} in the input. This kind of situation |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
153 |
can be avoided by using the funtion @{ML "(op !!)"}. This function aborts the whole process of |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
154 |
parsing in case of failure and invokes an error message. For example if we invoke the parser |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
155 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
156 |
@{ML [display] "(!! (fn _ => \"foo\") ($$ \"h\"))"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
157 |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
158 |
on @{ML_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
|
159 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
160 |
@{ML_response [display] |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
161 |
"(!! (fn _ => \"foo\") ($$ \"h\")) (explode \"hello\")" |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
162 |
"(\"h\", [\"e\", \"l\", \"l\", \"o\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
163 |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
164 |
but if we invoke it on @{ML_text [quotes] "world"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
165 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
166 |
@{ML_response_fake [display] "(!! (fn _ => \"foo\") ($$ \"h\")) (explode \"world\")" |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
167 |
"Exception ABORT raised"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
168 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
169 |
the parsing aborts and the error message @{ML_text "foo"} is printed out. In order to |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
170 |
see the error message properly, we need to prefix the parser with the function |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
171 |
@{ML "Scan.error"}. For example |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
172 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
173 |
@{ML_response_fake [display] "Scan.error ((!! (fn _ => \"foo\") ($$ \"h\")))" |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
174 |
"Exception Error \"foo\" raised"} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
175 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
176 |
This ``prefixing'' is usually done by wrappers such as @{ML "OuterSyntax.command"} |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
177 |
(FIXME: give reference to later place). |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
178 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
179 |
Returning to our example of parsing @{ML_open "(p -- q) || r" for p q r}. If we want |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
180 |
to generate the correct error message for p-followed-by-q, then |
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
|
181 |
we have to write, for example |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
182 |
*} |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
183 |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
184 |
ML {* |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
185 |
fun p_followed_by_q p q r = |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
186 |
let |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
187 |
val err = (fn _ => p ^ " is not followed by " ^ q) |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
188 |
in |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
189 |
(($$ p) -- (!! err ($$ q))) || (($$ r) -- ($$ r)) |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
190 |
end |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
191 |
*} |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
192 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
193 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
194 |
text {* |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
195 |
Running this parser with |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
196 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
197 |
@{ML_response_fake [display] "Scan.error (p_followed_by_q \"h\" \"e\" \"w\") (explode \"holle\")" |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
198 |
"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
|
199 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
200 |
gives the correct error message. Running it with |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
201 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
202 |
@{ML_response [display] "Scan.error (p_followed_by_q \"h\" \"e\" \"w\") (explode \"wworld\")" |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
203 |
"((\"w\", \"w\"), [\"o\", \"r\", \"l\", \"d\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
204 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
205 |
yields the expected parsing. |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
206 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
207 |
The function @{ML_open "Scan.repeat p" for p} will apply a parser @{ML_text p} as |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
208 |
often as it succeeds. For example |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
209 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
210 |
@{ML_response [display] "Scan.repeat ($$ \"h\") (explode \"hhhhello\")" |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
211 |
"([\"h\", \"h\", \"h\", \"h\"], [\"e\", \"l\", \"l\", \"o\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
212 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
213 |
Note that @{ML "Scan.repeat"} stores the parsed items in a list. The function |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
214 |
@{ML "Scan.repeat1"} is similar, but requires that the parser @{ML_text "p"} |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
215 |
succeeds at least once. |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
216 |
*} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
217 |
|
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
218 |
text {* |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
219 |
After parsing succeeded, one nearly always wants to apply a function on the parsed |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
220 |
items. This is done using the function @{ML_open "(p >> f)" for p f} which runs |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
221 |
first the parser @{ML_text p} and upon successful completion applies the |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
222 |
function @{ML_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
|
223 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
224 |
@{ML_response [display] |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
225 |
"let |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
226 |
fun double (x,y) = (x^x,y^y) |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
227 |
in |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
228 |
(($$ \"h\") -- ($$ \"e\") >> double) (explode \"hello\") |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
229 |
end" |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
230 |
"((\"hh\", \"ee\"), [\"l\", \"l\", \"o\"])"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
231 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
232 |
doubles the two parsed input strings. |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
233 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
234 |
The function @{ML Scan.lift} takes a parser and a pair as arguments. This function applies |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
235 |
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
|
236 |
untouched. For example |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
237 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
238 |
@{ML_response [display] |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
239 |
"Scan.lift (($$ \"h\") -- ($$ \"e\")) (1,(explode \"hello\"))" |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
240 |
"((\"h\", \"e\"), (1, [\"l\", \"l\", \"o\"]))"} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
241 |
|
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
|
242 |
(FIXME: In which situations is this useful? Give examples.) |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
243 |
*} |
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
244 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
245 |
section {* Parsing Theory Syntax *} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
246 |
|
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
247 |
text {* |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
248 |
Most of the time, however, Isabelle developers have to deal with parsing tokens, not strings. |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
249 |
This is because the parsers for the theory syntax, as well as the parsers for the |
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
|
250 |
argument syntax of proof methods and attributes use the type |
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
251 |
@{ML_type OuterParse.token} (which is identical to the type @{ML_type OuterLex.token}). |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
252 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
253 |
\begin{readmore} |
40
35e1dff0d9bb
more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents:
39
diff
changeset
|
254 |
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
|
255 |
@{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
|
256 |
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
|
257 |
\end{readmore} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
258 |
*} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
259 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
260 |
ML {* |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
261 |
let open OuterLex in |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
262 |
OuterSyntax.scan Position.none "for" |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
263 |
end; |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
264 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
265 |
*} |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
266 |
|
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
267 |
ML {* |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
268 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
269 |
fun my_scan lex pos str = |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
270 |
Source.of_string str |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
271 |
|> Symbol.source {do_recover = false} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
272 |
|> OuterLex.source {do_recover = SOME false} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
273 |
(fn () => pairself (Scan.make_lexicon o map Symbol.explode) lex) pos |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
274 |
|> Source.exhaust; |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
275 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
276 |
*} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
277 |
|
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
278 |
ML {* |
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
|
279 |
let val toks = my_scan (["hello"], []) Position.none "hello foo bar" |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
280 |
in (OuterParse.$$$ "hello") toks end |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
281 |
*} |
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
282 |
|
41
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
283 |
ML {* |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
284 |
|
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
285 |
let val input = [OuterLex.mk_text "hello", OuterLex.mk_text "world"]; |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
286 |
in (Scan.one (fn _ => true)) input end |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
287 |
|
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
288 |
*} |
b11653b11bd3
further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents:
40
diff
changeset
|
289 |
|
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
|
290 |
text {* |
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
|
291 |
explain @{ML "OuterParse.enum1"}, @{ML "OuterParse.prop"} |
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
|
292 |
@{ML "OuterParse.opt_target"}, @{ML "OuterParse.fixes"} |
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
|
293 |
@{ML "OuterParse.!!!"}, @{ML "OuterParse.for_fixes"} |
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
|
294 |
*} |
38
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
295 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
296 |
chapter {* Parsing *} |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
297 |
|
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
298 |
text {* |
e21b2f888fa2
added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents:
16
diff
changeset
|
299 |
|
4
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
300 |
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
|
301 |
including: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
302 |
\begin{itemize} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
303 |
\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
|
304 |
or simplified versions of such code |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
305 |
\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
|
306 |
(or specialisations of their types) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
307 |
\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
|
308 |
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
|
309 |
\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
|
310 |
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
|
311 |
\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
|
312 |
\end{itemize} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
313 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
314 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
315 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
316 |
section {* Parsing Isar input *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
317 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
318 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
319 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
320 |
The typical parsing function has the type |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
321 |
\texttt{'src -> 'res * 'src}, with input |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
322 |
of type \texttt{'src}, returning a result |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
323 |
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
|
324 |
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
|
325 |
(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
|
326 |
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
|
327 |
value of type \texttt{'res}). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
328 |
An exception is raised if an appropriate value |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
329 |
cannot be produced from the input. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
330 |
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
|
331 |
for the failure of a parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
332 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
333 |
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
|
334 |
which is of type |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
335 |
\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
|
336 |
(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
|
337 |
However, much of the discussion at |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
338 |
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
|
339 |
is relevant. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
340 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
341 |
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
|
342 |
as follows: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
343 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
344 |
open StringCvt ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
345 |
type ('res, 'src) ex_reader = 'src -> 'res * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
346 |
(* ex_reader : ('res, 'src) reader -> ('res, 'src) ex_reader *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
347 |
fun ex_reader rdr src = Option.valOf (rdr src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
348 |
(* reader : ('res, 'src) ex_reader -> ('res, 'src) reader *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
349 |
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
|
350 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
351 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
352 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
353 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
354 |
section{* The \texttt{Scan} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
355 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
356 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
357 |
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
|
358 |
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
|
359 |
of the type \texttt{'src -> 'res * 'src}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
360 |
Three exceptions are used: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
361 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
362 |
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
|
363 |
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
|
364 |
exception ABORT of string; (*dead end*) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
365 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
366 |
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
|
367 |
symbols) are declared as infix. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
368 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
369 |
Some functions from that structure are |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
370 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
371 |
|-- : ('src -> 'res1 * 'src') * ('src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
372 |
'src -> 'res2 * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
373 |
--| : ('src -> 'res1 * 'src') * ('src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
374 |
'src -> 'res1 * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
375 |
-- : ('src -> 'res1 * 'src') * ('src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
376 |
'src -> ('res1 * 'res2) * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
377 |
^^ : ('src -> string * 'src') * ('src' -> string * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
378 |
'src -> string * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
379 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
380 |
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
|
381 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
382 |
\texttt{|--} and \texttt{--|} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
383 |
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
|
384 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
385 |
\texttt{--} returns both. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
386 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
387 |
\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
|
388 |
(which must be strings). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
389 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
390 |
Note how, although the types |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
391 |
\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
|
392 |
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
|
393 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
394 |
:-- : ('src -> 'res1 * 'src') * ('res1 -> 'src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
395 |
'src -> ('res1 * 'res2) * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
396 |
:|-- : ('src -> 'res1 * 'src') * ('res1 -> 'src' -> 'res2 * 'src'') -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
397 |
'src -> 'res2 * 'src'' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
398 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
399 |
These are similar to \texttt{|--} and \texttt{--|}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
400 |
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
|
401 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
402 |
>> : ('src -> 'res1 * 'src') * ('res1 -> 'res2) -> 'src -> 'res2 * 'src' |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
403 |
|| : ('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
|
404 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
405 |
\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
|
406 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
407 |
\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
|
408 |
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
|
409 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
410 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
411 |
succeed : 'res -> ('src -> 'res * 'src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
412 |
fail : ('src -> 'res_src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
413 |
!! : ('src * string option -> string) -> |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
414 |
('src -> 'res_src) -> ('src -> 'res_src) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
415 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
416 |
\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
|
417 |
\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
|
418 |
\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
|
419 |
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
|
420 |
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
|
421 |
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
|
422 |
it won't recover by trying \texttt{parse2}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
423 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
424 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
425 |
one : ('si -> bool) -> ('si list -> 'si * 'si list) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
426 |
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
|
427 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
428 |
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
|
429 |
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
|
430 |
On other failures they raise \texttt{FAIL NONE} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
431 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
432 |
\texttt{one p} takes the first |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
433 |
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
|
434 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
435 |
\texttt{some f} takes the first |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
436 |
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
|
437 |
\texttt{NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
438 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
439 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
440 |
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
|
441 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
442 |
\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
|
443 |
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
|
444 |
it fails, raising \texttt{MORE NONE}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
445 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
446 |
\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
|
447 |
does not satisfy \texttt{p}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
448 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
449 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
450 |
option : ('src -> 'res * 'src) -> ('src -> 'res option * 'src) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
451 |
optional : ('src -> 'res * 'src) -> 'res -> ('src -> 'res * 'src) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
452 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
453 |
\texttt{option}: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
454 |
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
|
455 |
or raises \texttt{FAIL \_}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
456 |
\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
|
457 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
458 |
\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
|
459 |
\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
|
460 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
461 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
462 |
repeat : ('src -> 'res * 'src) -> 'src -> 'res list * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
463 |
repeat1 : ('src -> 'res * 'src) -> 'src -> 'res list * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
464 |
bulk : ('src -> 'res * 'src) -> 'src -> 'res list * 'src |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
465 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
466 |
\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
|
467 |
\texttt{f} fails with \texttt{FAIL \_} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
468 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
469 |
\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
|
470 |
successful parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
471 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
472 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
473 |
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
|
474 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
475 |
\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
|
476 |
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
|
477 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
478 |
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
|
479 |
HOW DO THEY WORK ?? TO BE COMPLETED |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
480 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
481 |
dest_lexicon: lexicon -> string list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
482 |
make_lexicon: string list list -> lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
483 |
empty_lexicon: lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
484 |
extend_lexicon: string list list -> lexicon -> lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
485 |
merge_lexicons: lexicon -> lexicon -> lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
486 |
is_literal: lexicon -> string list -> bool ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
487 |
literal: lexicon -> string list -> string list * string list ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
488 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
489 |
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
|
490 |
by: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
491 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
492 |
val (command_lexicon, keyword_lexicon) = OuterSyntax.get_lexicons () ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
493 |
val commands = Scan.dest_lexicon command_lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
494 |
val keywords = Scan.dest_lexicon keyword_lexicon ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
495 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
496 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
497 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
498 |
section{* The \texttt{OuterLex} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
499 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
500 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
501 |
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
|
502 |
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
|
503 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
504 |
structure T = OuterLex; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
505 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
506 |
This structure defines the type \texttt{token}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
507 |
(The types |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
508 |
\texttt{OuterLex.token}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
509 |
\texttt{OuterParse.token} and |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
510 |
\texttt{SpecParse.token} are all the same). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
511 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
512 |
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
|
513 |
functions is \texttt{token list}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
514 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
515 |
The datatype definition (which is not published in the signature) is |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
516 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
517 |
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
|
518 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
519 |
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
|
520 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
521 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
522 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
523 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
524 |
FIXME |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
525 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
526 |
@{text " |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
527 |
begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
528 |
type token = T.token ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
529 |
val toks : token list = OuterSyntax.scan ``theory,imports;begin x.y.z apply ?v1 ?'a 'a -- || 44 simp (* xx *) { * fff * }'' ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
530 |
print_depth 20 ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
531 |
List.map T.text_of toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
532 |
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
|
533 |
List.map T.kind_of proper_toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
534 |
List.map T.unparse proper_toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
535 |
List.map T.val_of proper_toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
536 |
end{verbatim}"} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
537 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
538 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
539 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
540 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
541 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
542 |
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
|
543 |
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
|
544 |
comments to have been filtered out. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
545 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
546 |
There is a special end-of-file token: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
547 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
548 |
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
|
549 |
(* end of file token *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
550 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
551 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
552 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
553 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
554 |
section {* The \texttt{OuterParse} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
555 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
556 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
557 |
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
|
558 |
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
|
559 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
560 |
structure P = OuterParse; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
561 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
562 |
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
|
563 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
564 |
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
|
565 |
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
|
566 |
\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
|
567 |
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
|
568 |
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
|
569 |
(eg, \texttt{name, xname, text, typ}). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
570 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
571 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
572 |
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
|
573 |
$$$ : string -> string tlp |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
574 |
nat : int tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
575 |
maybe : 'a tlp -> 'a option tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
576 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
577 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
578 |
\texttt{\$\$\$ s} returns the first token, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
579 |
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
|
580 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
581 |
\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
|
582 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
583 |
\texttt{maybe}: if \texttt{p} returns \texttt{r}, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
584 |
then \texttt{maybe p} returns \texttt{SOME r} ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
585 |
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
|
586 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
587 |
A few examples: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
588 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
589 |
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
|
590 |
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
|
591 |
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
|
592 |
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
|
593 |
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
|
594 |
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
|
595 |
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
|
596 |
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
|
597 |
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
|
598 |
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
|
599 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
600 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
601 |
The following code helps run examples: |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
602 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
603 |
fun parse_str tlp str = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
604 |
let val toks : token list = OuterSyntax.scan str ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
605 |
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
|
606 |
val (res, rem_toks) = tlp proper_toks ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
607 |
val rem_str = String.concat |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
608 |
(Library.separate " " (List.map T.unparse rem_toks)) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
609 |
in (res, rem_str) end ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
610 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
611 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
612 |
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
|
613 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
614 |
val type_args = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
615 |
type_ident >> Library.single || |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
616 |
$$$ "(" |-- !!! (list1 type_ident --| $$$ ")") || |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
617 |
Scan.succeed []; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
618 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
619 |
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
|
620 |
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
|
621 |
list. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
622 |
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
|
623 |
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
|
624 |
and then a ")" which is also ignored. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
625 |
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
|
626 |
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
|
627 |
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
|
628 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
629 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
630 |
fun triple2 (x, (y, z)) = (x, y, z); |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
631 |
val arity = xname -- ($$$ "::" |-- !!! ( |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
632 |
Scan.optional ($$$ "(" |-- !!! (list1 sort --| $$$ ")")) [] |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
633 |
-- sort)) >> triple2; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
634 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
635 |
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
|
636 |
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
|
637 |
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
|
638 |
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
|
639 |
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
|
640 |
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
|
641 |
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
|
642 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
643 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
644 |
parse_str P.type_args "('a, 'b) ntyp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
645 |
parse_str P.type_args "'a ntyp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
646 |
parse_str P.type_args "ntyp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
647 |
parse_str P.arity "ty :: tycl" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
648 |
parse_str P.arity "ty :: (tycl1, tycl2) tycl" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
649 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
650 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
651 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
652 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
653 |
section {* The \texttt{SpecParse} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
654 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
655 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
656 |
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
|
657 |
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
|
658 |
For example, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
659 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
660 |
open SpecParse ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
661 |
attrib : Attrib.src tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
662 |
attribs : Attrib.src list tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
663 |
opt_attribs : Attrib.src list tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
664 |
xthm : (thmref * Attrib.src list) tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
665 |
xthms1 : (thmref * Attrib.src list) list tok_rdr ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
666 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
667 |
parse_str attrib "simp" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
668 |
parse_str opt_attribs "hello" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
669 |
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
|
670 |
map Args.dest_src ass ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
671 |
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
|
672 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
673 |
parse_str xthm "mythm [attr]" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
674 |
parse_str xthms1 "thm1 [attr] thms2" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
675 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
676 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
677 |
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
|
678 |
structure, described below. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
679 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
680 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
681 |
section{* The \texttt{Args} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
682 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
683 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
684 |
The source file is \texttt{src/Pure/Isar/args.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
685 |
The primary type of this structure is the \texttt{src} datatype; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
686 |
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
|
687 |
\texttt{Args.src} and \texttt{Args.dest\_src} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
688 |
are in fact the constructor and destructor functions. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
689 |
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
|
690 |
are in fact \texttt{Args.src}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
691 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
692 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
693 |
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
|
694 |
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
|
695 |
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
|
696 |
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
|
697 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
698 |
val thy = ML_Context.the_context () ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
699 |
val ctxt = ProofContext.init thy ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
700 |
map (pr_src ctxt) ass ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
701 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
702 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
703 |
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
|
704 |
``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
|
705 |
input. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
706 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
707 |
(* how an Args.src is parsed *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
708 |
P.position : 'a tlp -> ('a * Position.T) tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
709 |
P.arguments : Args.T list tlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
710 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
711 |
val parse_src : Args.src tlp = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
712 |
P.position (P.xname -- P.arguments) >> Args.src ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
713 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
714 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
715 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
716 |
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
|
717 |
map Args.string_of args ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
718 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
719 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
720 |
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
|
721 |
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
|
722 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
723 |
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
|
724 |
open Args ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
725 |
nat : int atlp ; (* also Args.int *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
726 |
thm_sel : PureThy.interval list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
727 |
list : 'a atlp -> 'a list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
728 |
attribs : (string -> string) -> Args.src list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
729 |
opt_attribs : (string -> string) -> Args.src list atlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
730 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
731 |
(* parse_atl_str : 'a atlp -> (string -> 'a * string) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
732 |
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
|
733 |
fun parse_atl_str atlp str = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
734 |
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
|
735 |
val (res, rem_ats) = atlp ats ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
736 |
in (res, String.concat (Library.separate " " |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
737 |
(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
|
738 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
739 |
parse_atl_str Args.int "-1-," ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
740 |
parse_atl_str (Scan.option Args.int) "x1-," ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
741 |
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
|
742 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
743 |
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
|
744 |
"[THEN trans [THEN sym], simp, OF sym]" ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
745 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
746 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
747 |
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
|
748 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
749 |
\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
|
750 |
and also refer to a generic context. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
751 |
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
|
752 |
(as does \texttt{Attrib} - RETHINK THIS) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
753 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
754 |
(\texttt{Args.syntax} shown below has type specialised) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
755 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
756 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
757 |
type ('res, 'src) parse_fn = 'src -> 'res * 'src ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
758 |
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
|
759 |
Scan.lift : 'a atlp -> 'a cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
760 |
term : term cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
761 |
typ : typ cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
762 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
763 |
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
|
764 |
Attrib.thm : thm cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
765 |
Attrib.thms : thm list cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
766 |
Attrib.multi_thm : thm list cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
767 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
768 |
(* parse_cgatl_str : 'a cgatlp -> (string -> 'a * string) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
769 |
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
|
770 |
fun parse_cgatl_str cgatlp str = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
771 |
let |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
772 |
(* use the current generic context *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
773 |
val generic = Context.Theory thy ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
774 |
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
|
775 |
(* ignore any change to the generic context *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
776 |
val (res, (_, rem_ats)) = cgatlp (generic, ats) ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
777 |
in (res, String.concat (Library.separate " " |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
778 |
(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
|
779 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
780 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
781 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
782 |
section{* Attributes, and the \texttt{Attrib} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
783 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
784 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
785 |
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
|
786 |
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
|
787 |
\texttt{src/Pure/Isar/attrib.ML}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
788 |
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
|
789 |
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
|
790 |
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
|
791 |
theory). |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
792 |
The functions \texttt{Thm.rule\_attribute} and |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
793 |
\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
|
794 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
795 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
796 |
type attribute = Context.generic * thm -> Context.generic * thm; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
797 |
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
|
798 |
Thm.rule_attribute : (Context.generic -> thm -> thm) -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
799 |
Thm.declaration_attribute : (thm -> Context.generic trf) -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
800 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
801 |
Attrib.print_attributes : theory -> unit ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
802 |
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
|
803 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
804 |
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
|
805 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
806 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
807 |
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
|
808 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
809 |
Attrib.add_attributes : |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
810 |
(bstring * (src -> attribute) * string) list -> theory trf ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
811 |
(* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
812 |
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
|
813 |
*) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
814 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
815 |
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
|
816 |
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
|
817 |
(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
|
818 |
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
|
819 |
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
|
820 |
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
|
821 |
\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
|
822 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
823 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
824 |
FullAttrib.THEN_att : src -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
825 |
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
|
826 |
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
|
827 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
828 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
829 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
830 |
Attrib.syntax : attribute cgatlp -> src -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
831 |
Attrib.no_args : attribute -> src -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
832 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
833 |
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
|
834 |
the generic context \texttt{gc} is used |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
835 |
(and potentially changed to \texttt{gc'}) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
836 |
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
|
837 |
then be applied to \texttt{(gc', th)}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
838 |
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
|
839 |
which must all be consumed by the parse. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
840 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
841 |
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
|
842 |
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
|
843 |
\texttt{src} must be empty. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
844 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
845 |
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
|
846 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
847 |
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
|
848 |
rot_att_n : int -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
849 |
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
|
850 |
val rotated_att : src -> attribute = |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
851 |
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
|
852 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
853 |
val THEN_arg : int cgatlp = Scan.lift |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
854 |
(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
|
855 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
856 |
Attrib.thm : thm cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
857 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
858 |
THEN_arg -- Attrib.thm : (int * thm) cgatlp ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
859 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
860 |
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
|
861 |
THEN_att_n : int * thm -> attribute ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
862 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
863 |
val THEN_att : src -> attribute = Attrib.syntax |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
864 |
(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
|
865 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
866 |
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
|
867 |
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
|
868 |
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
|
869 |
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
|
870 |
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
|
871 |
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
|
872 |
parsed by \texttt{Attrib.thm}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
873 |
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
|
874 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
875 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
876 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
877 |
section{* Methods, and the \texttt{Method} structure *} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
878 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
879 |
text {* |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
880 |
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
|
881 |
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
|
882 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
883 |
(* datatype method = Meth of thm list -> cases_tactic; *) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
884 |
RuleCases.NO_CASES : tactic -> cases_tactic ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
885 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
886 |
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
|
887 |
\texttt{Meth}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
888 |
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
|
889 |
\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
|
890 |
\texttt{cases\_tactic} without any further case information. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
891 |
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
|
892 |
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
|
893 |
\emph{facts} in the proof. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
894 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
895 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
896 |
RAW_METHOD : (thm list -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
897 |
METHOD : (thm list -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
898 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
899 |
SIMPLE_METHOD : tactic -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
900 |
SIMPLE_METHOD' : (int -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
901 |
SIMPLE_METHOD'' : ((int -> tactic) -> tactic) -> (int -> tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
902 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
903 |
RAW_METHOD_CASES : (thm list -> cases_tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
904 |
METHOD_CASES : (thm list -> cases_tactic) -> method ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
905 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
906 |
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
|
907 |
the tactic to the current goal state. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
908 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
909 |
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
|
910 |
\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
|
911 |
goal state. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
912 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
913 |
\texttt{METHOD} is similar but also first applies |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
914 |
\texttt{Goal.conjunction\_tac} to all subgoals. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
915 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
916 |
\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
|
917 |
applies \texttt{tacf}. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
918 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
919 |
\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
|
920 |
applies \texttt{tacf} to subgoal 1. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
921 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
922 |
\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
|
923 |
\texttt{quant}, which may be, for example, |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
924 |
\texttt{ALLGOALS} (all subgoals), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
925 |
\texttt{TRYALL} (try all subgoals, failure is OK), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
926 |
\texttt{FIRSTGOAL} (try subgoals until it succeeds once), |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
927 |
\texttt{(fn tacf => tacf 4)} (subgoal 4), etc |
16 | 928 |
(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
|
929 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
930 |
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
|
931 |
\begin{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
932 |
Method.add_method : |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
933 |
(bstring * (src -> Proof.context -> method) * string) -> theory trf ; |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
934 |
( * |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
935 |
* ) |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
936 |
\end{verbatim} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
937 |
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
|
938 |
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
|
939 |
(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
|
940 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
941 |
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
|
942 |
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
|
943 |
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
|
944 |
\texttt{Method.add\_method} to add a number of methods. |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
945 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
946 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
947 |
*} |
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
948 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
949 |
|
2a69b119cdee
added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
950 |
end |