Source file g_number_string.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
let __coq_plugin_name = "number_string_notation_plugin"
let _ = Mltop.add_known_module __coq_plugin_name

# 13 "plugins/syntax/g_number_string.mlg"
 

open Notation
open Number
open String_notation
open Pp
open Stdarg
open Pcoq.Prim

let pr_number_after = function
  | Nop -> mt ()
  | Warning n -> str "warning after " ++ NumTok.UnsignedNat.print n
  | Abstract n -> str "abstract after " ++ NumTok.UnsignedNat.print n

let pr_deprecated_number_modifier m = str "(" ++ pr_number_after m ++ str ")"

let pr_number_string_mapping (b, n, n') =
  if b then
    str "[" ++ Libnames.pr_qualid n ++ str "]" ++ spc () ++ str "=>" ++ spc ()
    ++ Libnames.pr_qualid n'
  else
    Libnames.pr_qualid n ++ spc () ++ str "=>" ++ spc ()
    ++ Libnames.pr_qualid n'

let pr_number_string_via (n, l) =
  str "via " ++ Libnames.pr_qualid n ++ str " mapping ["
  ++ prlist_with_sep pr_comma pr_number_string_mapping l ++ str "]"

let pr_number_modifier = function
  | After a -> pr_number_after a
  | Via nl -> pr_number_string_via nl

let pr_number_options l =
  str "(" ++ prlist_with_sep pr_comma pr_number_modifier l ++ str ")"

let pr_string_option l =
  str "(" ++ pr_number_string_via l ++ str ")"



let (wit_deprecated_number_modifier, deprecated_number_modifier) = Vernacextend.vernac_argument_extend ~name:"deprecated_number_modifier" 
                                                                   {
                                                                   Vernacextend.arg_parsing = 
                                                                   Vernacextend.Arg_rules (
                                                                   [(
                                                                   Pcoq.Production.make
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.stop)
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "("))))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "abstract"))))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "after"))))
                                                                   ((Pcoq.Symbol.nterm bignat)))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal ")"))))
                                                                   (fun _ n _
                                                                   _ _ loc ->
                                                                   
# 57 "plugins/syntax/g_number_string.mlg"
                                                Abstract (NumTok.UnsignedNat.of_string n) 
                                                                   ));
                                                                   (Pcoq.Production.make
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.stop)
                                                                    ((Pcoq.Symbol.token (CLexer.terminal "("))))
                                                                    ((Pcoq.Symbol.token (CLexer.terminal "warning"))))
                                                                    ((Pcoq.Symbol.token (CLexer.terminal "after"))))
                                                                    ((Pcoq.Symbol.nterm bignat)))
                                                                    ((Pcoq.Symbol.token (CLexer.terminal ")"))))
                                                                    (fun _
                                                                    waft _ _
                                                                    _ loc ->
                                                                    
# 56 "plugins/syntax/g_number_string.mlg"
                                                  Warning (NumTok.UnsignedNat.of_string waft) 
                                                                    ));
                                                                   (Pcoq.Production.make
                                                                    (Pcoq.Rule.stop)
                                                                    (fun
                                                                    loc -> 
                                                                    
# 55 "plugins/syntax/g_number_string.mlg"
           Nop 
                                                                    ))]);
                                                                   Vernacextend.arg_printer = fun env sigma -> 
                                                                   
# 54 "plugins/syntax/g_number_string.mlg"
               pr_deprecated_number_modifier 
                                                                   ;
                                                                   }
let _ = (wit_deprecated_number_modifier, deprecated_number_modifier)

let (wit_number_string_mapping, number_string_mapping) = Vernacextend.vernac_argument_extend ~name:"number_string_mapping" 
                                                         {
                                                         Vernacextend.arg_parsing = 
                                                         Vernacextend.Arg_rules (
                                                         [(Pcoq.Production.make
                                                           (Pcoq.Rule.next 
                                                           (Pcoq.Rule.next 
                                                           (Pcoq.Rule.next 
                                                           (Pcoq.Rule.next 
                                                           (Pcoq.Rule.next 
                                                           (Pcoq.Rule.stop)
                                                           ((Pcoq.Symbol.token (CLexer.terminal "["))))
                                                           ((Pcoq.Symbol.nterm reference)))
                                                           ((Pcoq.Symbol.token (CLexer.terminal "]"))))
                                                           ((Pcoq.Symbol.token (CLexer.terminal "=>"))))
                                                           ((Pcoq.Symbol.nterm reference)))
                                                           (fun n' _ _ n _
                                                           loc -> 
# 63 "plugins/syntax/g_number_string.mlg"
                                                   true, n, n' 
                                                                  ));
                                                         (Pcoq.Production.make
                                                          (Pcoq.Rule.next 
                                                          (Pcoq.Rule.next 
                                                          (Pcoq.Rule.next 
                                                          (Pcoq.Rule.stop)
                                                          ((Pcoq.Symbol.nterm reference)))
                                                          ((Pcoq.Symbol.token (CLexer.terminal "=>"))))
                                                          ((Pcoq.Symbol.nterm reference)))
                                                          (fun n' _ n loc ->
                                                          
# 62 "plugins/syntax/g_number_string.mlg"
                                           false, n, n' 
                                                          ))]);
                                                         Vernacextend.arg_printer = fun env sigma -> 
                                                         
# 61 "plugins/syntax/g_number_string.mlg"
               pr_number_string_mapping 
                                                         ;
                                                         }
let _ = (wit_number_string_mapping, number_string_mapping)

let (wit_number_string_via, number_string_via) = Vernacextend.vernac_argument_extend ~name:"number_string_via" 
                                                 {
                                                 Vernacextend.arg_parsing = 
                                                 Vernacextend.Arg_rules (
                                                 [(Pcoq.Production.make
                                                   (Pcoq.Rule.next (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.stop)
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "via"))))
                                                                   ((Pcoq.Symbol.nterm reference)))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "mapping"))))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "["))))
                                                                   ((Pcoq.Symbol.list1sep ((Pcoq.Symbol.nterm number_string_mapping)) ((Pcoq.Symbol.rules 
                                                                   [Pcoq.Rules.make 
                                                                   (Pcoq.Rule.next_norec 
                                                                   (Pcoq.Rule.stop)
                                                                   ((Pcoq.Symbol.token (CLexer.terminal ","))))
                                                                   (fun _
                                                                   loc -> 
                                                                   
# 0 ""
()
                                                                   )])) false)))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "]"))))
                                                   (fun _ l _ _ n _ loc -> 
# 68 "plugins/syntax/g_number_string.mlg"
                                                                                          n, l 
                                                                    ))]);
                                                 Vernacextend.arg_printer = fun env sigma -> 
                                                 
# 67 "plugins/syntax/g_number_string.mlg"
               pr_number_string_via 
                                                 ;
                                                 }
let _ = (wit_number_string_via, number_string_via)

let (wit_number_modifier, number_modifier) = Vernacextend.vernac_argument_extend ~name:"number_modifier" 
                                             {
                                             Vernacextend.arg_parsing = 
                                             Vernacextend.Arg_rules (
                                             [(Pcoq.Production.make
                                               (Pcoq.Rule.next (Pcoq.Rule.stop)
                                                               ((Pcoq.Symbol.nterm number_string_via)))
                                               (fun v loc -> 
# 75 "plugins/syntax/g_number_string.mlg"
                                Via v 
                                                             ));
                                             (Pcoq.Production.make
                                              (Pcoq.Rule.next (Pcoq.Rule.next 
                                                              (Pcoq.Rule.next 
                                                              (Pcoq.Rule.stop)
                                                              ((Pcoq.Symbol.token (CLexer.terminal "abstract"))))
                                                              ((Pcoq.Symbol.token (CLexer.terminal "after"))))
                                                              ((Pcoq.Symbol.nterm bignat)))
                                              (fun n _ _ loc -> 
# 74 "plugins/syntax/g_number_string.mlg"
                                        After (Abstract (NumTok.UnsignedNat.of_string n)) 
                                                                ));
                                             (Pcoq.Production.make
                                              (Pcoq.Rule.next (Pcoq.Rule.next 
                                                              (Pcoq.Rule.next 
                                                              (Pcoq.Rule.stop)
                                                              ((Pcoq.Symbol.token (CLexer.terminal "warning"))))
                                                              ((Pcoq.Symbol.token (CLexer.terminal "after"))))
                                                              ((Pcoq.Symbol.nterm bignat)))
                                              (fun waft _ _ loc -> 
# 73 "plugins/syntax/g_number_string.mlg"
                                          After (Warning (NumTok.UnsignedNat.of_string waft)) 
                                                                   ))]);
                                             Vernacextend.arg_printer = fun env sigma -> 
                                             
# 72 "plugins/syntax/g_number_string.mlg"
               pr_number_modifier 
                                             ;
                                             }
let _ = (wit_number_modifier, number_modifier)

let (wit_number_options, number_options) = Vernacextend.vernac_argument_extend ~name:"number_options" 
                                           {
                                           Vernacextend.arg_parsing = 
                                           Vernacextend.Arg_rules ([(
                                                                   Pcoq.Production.make
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.next 
                                                                   (Pcoq.Rule.stop)
                                                                   ((Pcoq.Symbol.token (CLexer.terminal "("))))
                                                                   ((Pcoq.Symbol.list1sep ((Pcoq.Symbol.nterm number_modifier)) ((Pcoq.Symbol.rules 
                                                                   [Pcoq.Rules.make 
                                                                   (Pcoq.Rule.next_norec 
                                                                   (Pcoq.Rule.stop)
                                                                   ((Pcoq.Symbol.token (CLexer.terminal ","))))
                                                                   (fun _
                                                                   loc -> 
                                                                   
# 0 ""
()
                                                                   )])) false)))
                                                                   ((Pcoq.Symbol.token (CLexer.terminal ")"))))
                                                                   (fun _ l _
                                                                   loc -> 
                                                                   
# 80 "plugins/syntax/g_number_string.mlg"
                                                       l 
                                                                   ))]);
                                           Vernacextend.arg_printer = fun env sigma -> 
                                           
# 79 "plugins/syntax/g_number_string.mlg"
               pr_number_options 
                                           ;
                                           }
let _ = (wit_number_options, number_options)

let (wit_string_option, string_option) = Vernacextend.vernac_argument_extend ~name:"string_option" 
                                         {
                                         Vernacextend.arg_parsing = Vernacextend.Arg_rules (
                                                                    [(
                                                                    Pcoq.Production.make
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.next 
                                                                    (Pcoq.Rule.stop)
                                                                    ((Pcoq.Symbol.token (CLexer.terminal "("))))
                                                                    ((Pcoq.Symbol.nterm number_string_via)))
                                                                    ((Pcoq.Symbol.token (CLexer.terminal ")"))))
                                                                    (fun _ v
                                                                    _ loc ->
                                                                    
# 85 "plugins/syntax/g_number_string.mlg"
                                        v 
                                                                    ))]);
                                         Vernacextend.arg_printer = fun env sigma -> 
                                         
# 84 "plugins/syntax/g_number_string.mlg"
               pr_string_option 
                                         ;
                                         }
let _ = (wit_string_option, string_option)

let () = Vernacextend.vernac_extend ~command:"NumberNotation" ~classifier:(fun _ -> Vernacextend.classify_as_sideeff) ?entry:None 
         [(Vernacextend.TyML (false, Vernacextend.TyTerminal ("Number", 
                                     Vernacextend.TyTerminal ("Notation", 
                                     Vernacextend.TyNonTerminal (Extend.TUentry (Genarg.get_arg_tag wit_reference), 
                                     Vernacextend.TyNonTerminal (Extend.TUentry (Genarg.get_arg_tag wit_reference), 
                                     Vernacextend.TyNonTerminal (Extend.TUentry (Genarg.get_arg_tag wit_reference), 
                                     Vernacextend.TyNonTerminal (Extend.TUopt (
                                                                 Extend.TUentry (Genarg.get_arg_tag wit_number_options)), 
                                     Vernacextend.TyTerminal (":", Vernacextend.TyNonTerminal (
                                                                   Extend.TUentry (Genarg.get_arg_tag wit_preident), 
                                                                   Vernacextend.TyNil)))))))), 
         (let coqpp_body ty f g nl sc
         locality = Vernacextend.vtdefault (fun () -> 
# 92 "plugins/syntax/g_number_string.mlg"
      vernac_number_notation (Locality.make_module_locality locality) ty f g (Option.default [] nl) sc 
                    ) in fun ty
         f g nl sc ?loc ~atts () -> coqpp_body ty f g nl sc
         (Attributes.parse Attributes.locality atts)), None))]

let () = Vernacextend.vernac_extend ~command:"StringNotation" ~classifier:(fun _ -> Vernacextend.classify_as_sideeff) ?entry:None 
         [(Vernacextend.TyML (false, Vernacextend.TyTerminal ("String", 
                                     Vernacextend.TyTerminal ("Notation", 
                                     Vernacextend.TyNonTerminal (Extend.TUentry (Genarg.get_arg_tag wit_reference), 
                                     Vernacextend.TyNonTerminal (Extend.TUentry (Genarg.get_arg_tag wit_reference), 
                                     Vernacextend.TyNonTerminal (Extend.TUentry (Genarg.get_arg_tag wit_reference), 
                                     Vernacextend.TyNonTerminal (Extend.TUopt (
                                                                 Extend.TUentry (Genarg.get_arg_tag wit_string_option)), 
                                     Vernacextend.TyTerminal (":", Vernacextend.TyNonTerminal (
                                                                   Extend.TUentry (Genarg.get_arg_tag wit_preident), 
                                                                   Vernacextend.TyNil)))))))), 
         (let coqpp_body ty f g o sc
         locality = Vernacextend.vtdefault (fun () -> 
# 98 "plugins/syntax/g_number_string.mlg"
      vernac_string_notation (Locality.make_module_locality locality) ty f g o sc 
                    ) in fun ty
         f g o sc ?loc ~atts () -> coqpp_body ty f g o sc
         (Attributes.parse Attributes.locality atts)), None))]