| author | krauss | 
| Sun, 05 Aug 2012 23:37:26 +0200 | |
| changeset 48689 | ebbd70082e65 | 
| parent 47067 | 4ef29b0c568f | 
| child 49754 | acafcac41690 | 
| permissions | -rw-r--r-- | 
| 36952 
338c3f8229e4
renamed structure SpecParse to Parse_Spec, keeping the old name as alias for some time;
 wenzelm parents: 
36950diff
changeset | 1 | (* Title: Pure/Isar/parse_spec.ML | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 3 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 4 | Parsers for complex specifications. | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 5 | *) | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 6 | |
| 36952 
338c3f8229e4
renamed structure SpecParse to Parse_Spec, keeping the old name as alias for some time;
 wenzelm parents: 
36950diff
changeset | 7 | signature PARSE_SPEC = | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 8 | sig | 
| 29312 | 9 | val attribs: Attrib.src list parser | 
| 10 | val opt_attribs: Attrib.src list parser | |
| 11 | val thm_name: string -> Attrib.binding parser | |
| 12 | val opt_thm_name: string -> Attrib.binding parser | |
| 30481 
de003023c302
removed old named_spec, spec_name, spec_opt_name;
 wenzelm parents: 
29601diff
changeset | 13 | val spec: (Attrib.binding * string) parser | 
| 
de003023c302
removed old named_spec, spec_name, spec_opt_name;
 wenzelm parents: 
29601diff
changeset | 14 | val specs: (Attrib.binding * string list) parser | 
| 
de003023c302
removed old named_spec, spec_name, spec_opt_name;
 wenzelm parents: 
29601diff
changeset | 15 | val alt_specs: (Attrib.binding * string) list parser | 
| 
de003023c302
removed old named_spec, spec_name, spec_opt_name;
 wenzelm parents: 
29601diff
changeset | 16 | val where_alt_specs: (Attrib.binding * string) list parser | 
| 29312 | 17 | val xthm: (Facts.ref * Attrib.src list) parser | 
| 18 | val xthms1: (Facts.ref * Attrib.src list) list parser | |
| 19 | val name_facts: (Attrib.binding * (Facts.ref * Attrib.src list) list) list parser | |
| 33287 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 20 | val constdecl: (binding * string option * mixfix) parser | 
| 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 21 | val constdef: ((binding * string option * mixfix) option * (Attrib.binding * string)) parser | 
| 47067 
4ef29b0c568f
optional 'includes' element for long theorem statements;
 wenzelm parents: 
46922diff
changeset | 22 | val includes: (xstring * Position.T) list parser | 
| 29312 | 23 | val locale_mixfix: mixfix parser | 
| 29581 | 24 | val locale_fixes: (binding * string option * mixfix) list parser | 
| 29312 | 25 | val locale_insts: (string option list * (Attrib.binding * string) list) parser | 
| 46922 
3717f3878714
source positions for locale and class expressions;
 wenzelm parents: 
45592diff
changeset | 26 | val class_expression: string list parser | 
| 30726 | 27 | val locale_expression: bool -> Expression.expression parser | 
| 29312 | 28 | val locale_keyword: string parser | 
| 29 | val context_element: Element.context parser | |
| 30 | val statement: (Attrib.binding * (string * string list) list) list parser | |
| 31 | val general_statement: (Element.context list * Element.statement) parser | |
| 32 | val statement_keyword: string parser | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 33 | end; | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 34 | |
| 36952 
338c3f8229e4
renamed structure SpecParse to Parse_Spec, keeping the old name as alias for some time;
 wenzelm parents: 
36950diff
changeset | 35 | structure Parse_Spec: PARSE_SPEC = | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 36 | struct | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 37 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 38 | (* theorem specifications *) | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 39 | |
| 40800 
330eb65c9469
Parse.liberal_name for document antiquotations and attributes;
 wenzelm parents: 
40793diff
changeset | 40 | val attrib = Parse.position (Parse.liberal_name -- Parse.!!! Args.parse) >> Args.src; | 
| 36950 | 41 | val attribs = Parse.$$$ "[" |-- Parse.list attrib --| Parse.$$$ "]"; | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 42 | val opt_attribs = Scan.optional attribs []; | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 43 | |
| 36950 | 44 | fun thm_name s = Parse.binding -- opt_attribs --| Parse.$$$ s; | 
| 28083 
103d9282a946
explicit type Name.binding for higher-specification elements;
 wenzelm parents: 
27816diff
changeset | 45 | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 46 | fun opt_thm_name s = | 
| 36950 | 47 | Scan.optional ((Parse.binding -- opt_attribs || attribs >> pair Binding.empty) --| Parse.$$$ s) | 
| 28965 | 48 | Attrib.empty_binding; | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 49 | |
| 36950 | 50 | val spec = opt_thm_name ":" -- Parse.prop; | 
| 51 | val specs = opt_thm_name ":" -- Scan.repeat1 Parse.prop; | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 52 | |
| 30481 
de003023c302
removed old named_spec, spec_name, spec_opt_name;
 wenzelm parents: 
29601diff
changeset | 53 | val alt_specs = | 
| 36950 | 54 | Parse.enum1 "|" | 
| 55 | (spec --| Scan.option (Scan.ahead (Parse.name || Parse.$$$ "[") -- Parse.!!! (Parse.$$$ "|"))); | |
| 30481 
de003023c302
removed old named_spec, spec_name, spec_opt_name;
 wenzelm parents: 
29601diff
changeset | 56 | |
| 36950 | 57 | val where_alt_specs = Parse.where_ |-- Parse.!!! alt_specs; | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 58 | |
| 24013 
3063a756611d
xthm: added [[declaration]] syntax (abbreviates dummy_thm [att]);
 wenzelm parents: 
23919diff
changeset | 59 | val xthm = | 
| 36950 | 60 | Parse.$$$ "[" |-- attribs --| Parse.$$$ "]" >> pair (Facts.named "") || | 
| 40793 
d21aedaa91e7
added Parse.literal_fact with proper inner_syntax markup (source position);
 wenzelm parents: 
36955diff
changeset | 61 | (Parse.literal_fact >> Facts.Fact || | 
| 36950 | 62 | Parse.position Parse.xname -- Scan.option Attrib.thm_sel >> Facts.Named) -- opt_attribs; | 
| 24013 
3063a756611d
xthm: added [[declaration]] syntax (abbreviates dummy_thm [att]);
 wenzelm parents: 
23919diff
changeset | 63 | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 64 | val xthms1 = Scan.repeat1 xthm; | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 65 | |
| 36950 | 66 | val name_facts = Parse.and_list1 (opt_thm_name "=" -- xthms1); | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 67 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 68 | |
| 33287 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 69 | (* basic constant specifications *) | 
| 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 70 | |
| 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 71 | val constdecl = | 
| 36950 | 72 | Parse.binding -- | 
| 73 | (Parse.where_ >> K (NONE, NoSyn) || | |
| 74 | Parse.$$$ "::" |-- Parse.!!! ((Parse.typ >> SOME) -- Parse.opt_mixfix' --| Parse.where_) || | |
| 75 |       Scan.ahead (Parse.$$$ "(") |-- Parse.!!! (Parse.mixfix' --| Parse.where_ >> pair NONE))
 | |
| 76 | >> Parse.triple2; | |
| 33287 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 77 | |
| 36950 | 78 | val constdef = Scan.option constdecl -- (opt_thm_name ":" -- Parse.prop); | 
| 33287 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 79 | |
| 
0f99569d23e1
provide SpecParse.constdecl/constdef, e.g. for quotient_definition;
 wenzelm parents: 
30726diff
changeset | 80 | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 81 | (* locale and context elements *) | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 82 | |
| 47067 
4ef29b0c568f
optional 'includes' element for long theorem statements;
 wenzelm parents: 
46922diff
changeset | 83 | val includes = Parse.$$$ "includes" |-- Parse.!!! (Scan.repeat1 (Parse.position Parse.xname)); | 
| 
4ef29b0c568f
optional 'includes' element for long theorem statements;
 wenzelm parents: 
46922diff
changeset | 84 | |
| 36950 | 85 | val locale_mixfix = | 
| 86 |   Parse.$$$ "(" -- Parse.$$$ "structure" -- Parse.!!! (Parse.$$$ ")") >> K Structure ||
 | |
| 87 | Parse.mixfix; | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 88 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 89 | val locale_fixes = | 
| 36950 | 90 | Parse.and_list1 (Parse.binding -- Scan.option (Parse.$$$ "::" |-- Parse.typ) -- locale_mixfix | 
| 91 | >> (single o Parse.triple1) || | |
| 42287 
d98eb048a2e4
discontinued special treatment of structure Mixfix;
 wenzelm parents: 
40800diff
changeset | 92 | Parse.params >> map (fn (x, y) => (x, y, NoSyn))) >> flat; | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 93 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 94 | val locale_insts = | 
| 36950 | 95 | Scan.optional | 
| 96 | (Parse.$$$ "[" |-- Parse.!!! (Scan.repeat1 (Parse.maybe Parse.term) --| Parse.$$$ "]")) [] -- | |
| 97 | Scan.optional (Parse.where_ |-- Parse.and_list1 (opt_thm_name ":" -- Parse.prop)) []; | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 98 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 99 | local | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 100 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 101 | val loc_element = | 
| 36950 | 102 | Parse.$$$ "fixes" |-- Parse.!!! locale_fixes >> Element.Fixes || | 
| 103 | Parse.$$$ "constrains" |-- | |
| 104 | Parse.!!! (Parse.and_list1 (Parse.name -- (Parse.$$$ "::" |-- Parse.typ))) | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 105 | >> Element.Constrains || | 
| 36950 | 106 | Parse.$$$ "assumes" |-- Parse.!!! (Parse.and_list1 (opt_thm_name ":" -- Scan.repeat1 Parse.propp)) | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 107 | >> Element.Assumes || | 
| 36950 | 108 | Parse.$$$ "defines" |-- Parse.!!! (Parse.and_list1 (opt_thm_name ":" -- Parse.propp)) | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 109 | >> Element.Defines || | 
| 36950 | 110 | Parse.$$$ "notes" |-- Parse.!!! (Parse.and_list1 (opt_thm_name "=" -- xthms1)) | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 111 | >> (curry Element.Notes ""); | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 112 | |
| 24869 | 113 | fun plus1_unless test scan = | 
| 36950 | 114 | scan ::: Scan.repeat (Parse.$$$ "+" |-- Scan.unless test (Parse.!!! scan)); | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 115 | |
| 30726 | 116 | fun prefix mandatory = | 
| 36950 | 117 | Parse.name -- | 
| 118 | (Parse.$$$ "!" >> K true || Parse.$$$ "?" >> K false || Scan.succeed mandatory) --| | |
| 119 | Parse.$$$ ":"; | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 120 | |
| 36950 | 121 | val instance = Parse.where_ |-- | 
| 122 | Parse.and_list1 (Parse.name -- (Parse.$$$ "=" |-- Parse.term)) >> Expression.Named || | |
| 123 | Scan.repeat1 (Parse.maybe Parse.term) >> Expression.Positional; | |
| 29033 
721529248e31
Enable keyword 'structure' in for clause of locale expression.
 ballarin parents: 
28965diff
changeset | 124 | |
| 24869 | 125 | in | 
| 126 | ||
| 36950 | 127 | val locale_keyword = | 
| 128 | Parse.$$$ "fixes" || Parse.$$$ "constrains" || Parse.$$$ "assumes" || | |
| 129 | Parse.$$$ "defines" || Parse.$$$ "notes"; | |
| 28722 | 130 | |
| 46922 
3717f3878714
source positions for locale and class expressions;
 wenzelm parents: 
45592diff
changeset | 131 | val class_expression = plus1_unless locale_keyword Parse.class; | 
| 24869 | 132 | |
| 30726 | 133 | fun locale_expression mandatory = | 
| 29033 
721529248e31
Enable keyword 'structure' in for clause of locale expression.
 ballarin parents: 
28965diff
changeset | 134 | let | 
| 46922 
3717f3878714
source positions for locale and class expressions;
 wenzelm parents: 
45592diff
changeset | 135 | val expr2 = Parse.position Parse.xname; | 
| 30726 | 136 |     val expr1 = Scan.optional (prefix mandatory) ("", false) -- expr2 --
 | 
| 30720 | 137 | Scan.optional instance (Expression.Named []) >> (fn ((p, l), i) => (l, (p, i))); | 
| 138 | val expr0 = plus1_unless locale_keyword expr1; | |
| 36950 | 139 | in expr0 -- Scan.optional (Parse.$$$ "for" |-- Parse.!!! locale_fixes) [] end; | 
| 29033 
721529248e31
Enable keyword 'structure' in for clause of locale expression.
 ballarin parents: 
28965diff
changeset | 140 | |
| 44357 | 141 | val context_element = Parse.group (fn () => "context element") loc_element; | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 142 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 143 | end; | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 144 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 145 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 146 | (* statements *) | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 147 | |
| 36950 | 148 | val statement = Parse.and_list1 (opt_thm_name ":" -- Scan.repeat1 Parse.propp); | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 149 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 150 | val obtain_case = | 
| 36950 | 151 | Parse.parbinding -- (Scan.optional (Parse.simple_fixes --| Parse.where_) [] -- | 
| 152 | (Parse.and_list1 (Scan.repeat1 Parse.prop) >> flat)); | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 153 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 154 | val general_statement = | 
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 155 | statement >> (fn x => ([], Element.Shows x)) || | 
| 28722 | 156 | Scan.repeat context_element -- | 
| 36950 | 157 | (Parse.$$$ "obtains" |-- Parse.!!! (Parse.enum1 "|" obtain_case) >> Element.Obtains || | 
| 158 | Parse.$$$ "shows" |-- Parse.!!! statement >> Element.Shows); | |
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 159 | |
| 36950 | 160 | val statement_keyword = Parse.$$$ "obtains" || Parse.$$$ "shows"; | 
| 22104 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 161 | |
| 
e8a1c88be824
Parsers for complex specifications (material from outer_parse.ML);
 wenzelm parents: diff
changeset | 162 | end; | 
| 36952 
338c3f8229e4
renamed structure SpecParse to Parse_Spec, keeping the old name as alias for some time;
 wenzelm parents: 
36950diff
changeset | 163 |