File size: 48,181 Bytes
28c70af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
{
 "source": "llama.cpp b11192 (171e8846b) tests/test-json-schema-to-grammar.cpp, test_all(): every case with its expected grammar; MIT, Copyright (c) 2023-2026 The ggml authors (LICENSING.md)",
 "cases": [
  {
   "name": "min 0",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 0\n        }",
   "grammar": "\n            root ::= ([0] | [1-9] [0-9]{0,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 1",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 1\n        }",
   "grammar": "\n            root ::= ([1-9] [0-9]{0,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 3",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 3\n        }",
   "grammar": "\n            root ::= ([1-2] [0-9]{1,15} | [3-9] [0-9]{0,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 9",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 9\n        }",
   "grammar": "\n            root ::= ([1-8] [0-9]{1,15} | [9] [0-9]{0,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 10",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 10\n        }",
   "grammar": "\n            root ::= ([1] ([0-9]{1,15}) | [2-9] [0-9]{1,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 25",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 25\n        }",
   "grammar": "\n            root ::= ([1] [0-9]{2,15} | [2] ([0-4] [0-9]{1,14} | [5-9] [0-9]{0,14}) | [3-9] [0-9]{1,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "max 30",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"maximum\": 30\n        }",
   "grammar": "\n            root ::= (\"-\" [1-9] [0-9]{0,15} | [0-9] | ([1-2] [0-9] | [3] \"0\"))\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min -5",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": -5\n        }",
   "grammar": "\n            root ::= (\"-\" ([0-5]) | [0] | [1-9] [0-9]{0,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min -123",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": -123\n        }",
   "grammar": "\n            root ::= (\"-\" ([0-9] | ([1-8] [0-9] | [9] [0-9]) | \"1\" ([0-1] [0-9] | [2] [0-3])) | [0] | [1-9] [0-9]{0,15})\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "max -5",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"maximum\": -5\n        }",
   "grammar": "\n            root ::= (\"-\" ([0-4] [0-9]{1,15} | [5-9] [0-9]{0,15}))\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "max 1",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"maximum\": 1\n        }",
   "grammar": "\n            root ::= (\"-\" [1-9] [0-9]{0,15} | [0-1])\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "max 100",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"maximum\": 100\n        }",
   "grammar": "\n            root ::= (\"-\" [1-9] [0-9]{0,15} | [0-9] | ([1-8] [0-9] | [9] [0-9]) | \"100\")\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 0 max 23",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 23\n        }",
   "grammar": "\n            root ::= ([0-9] | ([1] [0-9] | [2] [0-3]))\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 15 max 300",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 15,\n            \"maximum\": 300\n        }",
   "grammar": "\n            root ::= (([1] ([5-9]) | [2-9] [0-9]) | ([1-2] [0-9]{2} | [3] \"00\"))\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min 5 max 30",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": 5,\n            \"maximum\": 30\n        }",
   "grammar": "\n            root ::= ([5-9] | ([1-2] [0-9] | [3] \"0\"))\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min -123 max 42",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": -123,\n            \"maximum\": 42\n        }",
   "grammar": "\n            root ::= (\"-\" ([0-9] | ([1-8] [0-9] | [9] [0-9]) | \"1\" ([0-1] [0-9] | [2] [0-3])) | [0-9] | ([1-3] [0-9] | [4] [0-2]))\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min -10 max 10",
   "success": true,
   "schema": "{\n            \"type\": \"integer\",\n            \"minimum\": -10,\n            \"maximum\": 10\n        }",
   "grammar": "\n            root ::= (\"-\" ([0-9] | \"10\") | [0-9] | \"10\")\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "unknown type",
   "success": false,
   "schema": "{\n            \"type\": \"kaboom\"\n        }",
   "grammar": ""
  },
  {
   "name": "invalid type",
   "success": false,
   "schema": "{\n            \"type\": 123\n        }",
   "grammar": ""
  },
  {
   "name": "empty schema (any value)",
   "success": true,
   "schema": "{}",
   "grammar": "\n            array ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            null ::= \"null\"\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            object ::= \"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? space \"}\"\n            root ::= value\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n            value ::= object | array | string | number | boolean | null\n        "
  },
  {
   "name": "exotic formats",
   "success": true,
   "schema": "{\n            \"items\": [\n                { \"format\": \"date\" },\n                { \"format\": \"uuid\" },\n                { \"format\": \"time\" },\n                { \"format\": \"date-time\" }\n            ]\n        }",
   "grammar": "\n            date ::= [0-9]{4} \"-\" ( \"0\" [1-9] | \"1\" [0-2] ) \"-\" ( \"0\" [1-9] | [1-2] [0-9] | \"3\" [0-1] )\n            date-string ::= \"\\\"\" date \"\\\"\"\n            date-time ::= date \"T\" time\n            date-time-string ::= \"\\\"\" date-time \"\\\"\"\n            root ::= \"[\" space tuple-0 \",\" space uuid \",\" space tuple-2 \",\" space tuple-3 space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            time ::= ([01] [0-9] | \"2\" [0-3]) \":\" [0-5] [0-9] \":\" [0-5] [0-9] ( \".\" [0-9]{3} )? ( \"Z\" | ( \"+\" | \"-\" ) ( [01] [0-9] | \"2\" [0-3] ) \":\" [0-5] [0-9] )\n            time-string ::= \"\\\"\" time \"\\\"\"\n            tuple-0 ::= date-string\n            tuple-2 ::= time-string\n            tuple-3 ::= date-time-string\n            uuid ::= \"\\\"\" [0-9a-fA-F]{8} \"-\" [0-9a-fA-F]{4} \"-\" [0-9a-fA-F]{4} \"-\" [0-9a-fA-F]{4} \"-\" [0-9a-fA-F]{12} \"\\\"\"\n        "
  },
  {
   "name": "string",
   "success": true,
   "schema": "{\n            \"type\": \"string\"\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"\\\"\" char* \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "string w/ min length 1",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"minLength\": 1\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"\\\"\" char+ \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "string w/ min length 3",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"minLength\": 3\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"\\\"\" char{3,} \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "string w/ max length",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"maxLength\": 3\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"\\\"\" char{0,3} \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "string w/ min & max length",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"\\\"\" char{1,4} \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "boolean",
   "success": true,
   "schema": "{\n            \"type\": \"boolean\"\n        }",
   "grammar": "\n            root ::= (\"true\" | \"false\")\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "integer",
   "success": true,
   "schema": "{\n            \"type\": \"integer\"\n        }",
   "grammar": "\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            root ::= (\"-\"? integral-part)\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "string const",
   "success": true,
   "schema": "{\n            \"const\": \"foo\"\n        }",
   "grammar": "\n            root ::= \"\\\"foo\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "non-string const",
   "success": true,
   "schema": "{\n            \"const\": 123\n        }",
   "grammar": "\n            root ::= \"123\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "non-string enum",
   "success": true,
   "schema": "{\n            \"enum\": [\"red\", \"amber\", \"green\", null, 42, [\"foo\"]]\n        }",
   "grammar": "\n            root ::= (\"\\\"red\\\"\" | \"\\\"amber\\\"\" | \"\\\"green\\\"\" | \"null\" | \"42\" | \"[\\\"foo\\\"]\")\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "string array",
   "success": true,
   "schema": "{\n            \"type\": \"array\",\n            \"prefixItems\": { \"type\": \"string\" }\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"[\" space (string (\",\" space string)*)? space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "nullable string array",
   "success": true,
   "schema": "{\n            \"type\": [\"array\", \"null\"],\n            \"prefixItems\": { \"type\": \"string\" }\n        }",
   "grammar": "\n            alternative-0 ::= \"[\" space (string (\",\" space string)*)? space \"]\"\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            null ::= \"null\"\n            root ::= alternative-0 | null\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "tuple1",
   "success": true,
   "schema": "{\n            \"prefixItems\": [{ \"type\": \"string\" }]\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"[\" space string space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "tuple2",
   "success": true,
   "schema": "{\n            \"prefixItems\": [{ \"type\": \"string\" }, { \"type\": \"number\" }]\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"[\" space string \",\" space number space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "array with empty items",
   "success": true,
   "schema": "{\n            \"type\": \"array\",\n            \"items\": {}\n        }",
   "grammar": "\n            array ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            null ::= \"null\"\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            object ::= \"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? space \"}\"\n            root ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n            value ::= object | array | string | number | boolean | null\n        "
  },
  {
   "name": "array with empty items and prefixItems",
   "success": true,
   "schema": "{\n            \"type\": \"array\",\n            \"items\": {},\n            \"prefixItems\": { \"type\": \"string\" }\n        }",
   "grammar": "\n            array ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            null ::= \"null\"\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            object ::= \"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? space \"}\"\n            root ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n            value ::= object | array | string | number | boolean | null\n        "
  },
  {
   "name": "number",
   "success": true,
   "schema": "{\n            \"type\": \"number\"\n        }",
   "grammar": "\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            root ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "minItems",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": \"boolean\"\n            },\n            \"minItems\": 2\n        }",
   "grammar": "\n            boolean ::= (\"true\" | \"false\")\n            root ::= \"[\" space boolean (\",\" space boolean)+ space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "maxItems 0",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": \"boolean\"\n            },\n            \"maxItems\": 0\n        }",
   "grammar": "\n            boolean ::= (\"true\" | \"false\")\n            root ::= \"[\" space  space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "maxItems 1",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": \"boolean\"\n            },\n            \"maxItems\": 1\n        }",
   "grammar": "\n            boolean ::= (\"true\" | \"false\")\n            root ::= \"[\" space boolean? space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "maxItems 2",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": \"boolean\"\n            },\n            \"maxItems\": 2\n        }",
   "grammar": "\n            boolean ::= (\"true\" | \"false\")\n            root ::= \"[\" space (boolean (\",\" space boolean)?)? space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min + maxItems",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": [\"number\", \"integer\"]\n            },\n            \"minItems\": 3,\n            \"maxItems\": 5\n        }",
   "grammar": "\n            decimal-part ::= [0-9]{1,16}\n            integer ::= (\"-\"? integral-part)\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            item ::= number | integer\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"[\" space item (\",\" space item){2,4} space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min + max items with min + max values across zero",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": \"integer\",\n                \"minimum\": -12,\n                \"maximum\": 207\n            },\n            \"minItems\": 3,\n            \"maxItems\": 5\n        }",
   "grammar": "\n            item ::= (\"-\" ([0-9] | \"1\" [0-2]) | [0-9] | ([1-8] [0-9] | [9] [0-9]) | ([1] [0-9]{2} | [2] \"0\" [0-7]))\n            root ::= \"[\" space item (\",\" space item){2,4} space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "min + max items with min + max values",
   "success": true,
   "schema": "{\n            \"items\": {\n                \"type\": \"integer\",\n                \"minimum\": 12,\n                \"maximum\": 207\n            },\n            \"minItems\": 3,\n            \"maxItems\": 5\n        }",
   "grammar": "\n            item ::= (([1] ([2-9]) | [2-9] [0-9]) | ([1] [0-9]{2} | [2] \"0\" [0-7]))\n            root ::= \"[\" space item (\",\" space item){2,4} space \"]\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "simple regexp",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^abc?d*efg+(hij)?kl$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" (\"ab\" \"c\"? \"d\"* \"ef\" \"g\"+ (\"hij\")? \"kl\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp escapes",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^\\\\[\\\\]\\\\{\\\\}\\\\(\\\\)\\\\|\\\\+\\\\*\\\\?$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" (\"[]{}()|+*?\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp quote",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^\\\"$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" (\"\\\"\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp with top-level alternation",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^A|B|C|D$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" (\"A\" | \"B\" | \"C\" | \"D\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^(\\\\([0-9]{1,3}\\\\))?[0-9]{3}-[0-9]{4} a{3,5}nd...$\"\n        }",
   "grammar": "\n            dot ::= [^\\x0A\\x0D]\n            root ::= \"\\\"\" ((\"(\" root-1{1,3} \")\")? root-1{3,3} \"-\" root-1{4,4} \" \" \"a\"{3,5} \"nd\" dot dot dot) \"\\\"\"\n            root-1 ::= [0-9]\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "required props in original order",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"properties\": {\n                \"b\": {\"type\": \"string\"},\n                \"c\": {\"type\": \"string\"},\n                \"a\": {\"type\": \"string\"}\n            },\n            \"required\": [\n                \"a\",\n                \"b\",\n                \"c\"\n            ],\n            \"additionalProperties\": false,\n            \"definitions\": {}\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space string\n            b-kv ::= \"\\\"b\\\"\" space \":\" space string\n            c-kv ::= \"\\\"c\\\"\" space \":\" space string\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"{\" space b-kv \",\" space c-kv \",\" space a-kv space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "1 optional prop",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"a\": {\n                \"type\": \"string\"\n                }\n            },\n            \"additionalProperties\": false\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space string\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"{\" space  (a-kv )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "N optional props",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"a\": {\"type\": \"string\"},\n                \"b\": {\"type\": \"string\"},\n                \"c\": {\"type\": \"string\"}\n            },\n            \"additionalProperties\": false\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space string\n            a-rest ::= ( \",\" space b-kv )? b-rest\n            b-kv ::= \"\\\"b\\\"\" space \":\" space string\n            b-rest ::= ( \",\" space c-kv )?\n            c-kv ::= \"\\\"c\\\"\" space \":\" space string\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"{\" space  (a-kv a-rest | b-kv b-rest | c-kv )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "required + optional props each in original order",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"b\": {\"type\": \"string\"},\n                \"a\": {\"type\": \"string\"},\n                \"d\": {\"type\": \"string\"},\n                \"c\": {\"type\": \"string\"}\n            },\n            \"required\": [\"a\", \"b\"],\n            \"additionalProperties\": false\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space string\n            b-kv ::= \"\\\"b\\\"\" space \":\" space string\n            c-kv ::= \"\\\"c\\\"\" space \":\" space string\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            d-kv ::= \"\\\"d\\\"\" space \":\" space string\n            d-rest ::= ( \",\" space c-kv )?\n            root ::= \"{\" space b-kv \",\" space a-kv ( \",\" space ( d-kv d-rest | c-kv ) )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "additional props",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"additionalProperties\": {\"type\": \"array\", \"items\": {\"type\": \"number\"}}\n        }",
   "grammar": "\n            additional-kv ::= string \":\" space additional-value\n            additional-value ::= \"[\" space (number (\",\" space number)*)? space \"]\"\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"{\" space  (additional-kv ( \",\" space additional-kv )* )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "additional props (true)",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"additionalProperties\": true\n        }",
   "grammar": "\n            array ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            null ::= \"null\"\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            object ::= \"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? space \"}\"\n            root ::= object\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n            value ::= object | array | string | number | boolean | null\n        "
  },
  {
   "name": "additional props (implicit)",
   "success": true,
   "schema": "{\n            \"type\": \"object\"\n        }",
   "grammar": "\n            array ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            null ::= \"null\"\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            object ::= \"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? space \"}\"\n            root ::= object\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n            value ::= object | array | string | number | boolean | null\n        "
  },
  {
   "name": "empty w/o additional props",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"additionalProperties\": false\n        }",
   "grammar": "\n            root ::= \"{\" space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "required + additional props",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"properties\": {\n                \"a\": {\"type\": \"number\"}\n            },\n            \"required\": [\"a\"],\n            \"additionalProperties\": {\"type\": \"string\"}\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space number\n            additional-k ::= [\"] ( [a] char+ | [^\"a] char* )? [\"]\n            additional-kv ::= additional-k \":\" space string\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"{\" space a-kv ( \",\" space ( additional-kv ( \",\" space additional-kv )* ) )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "optional + additional props",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"properties\": {\n                \"a\": {\"type\": \"number\"}\n            },\n            \"additionalProperties\": {\"type\": \"number\"}\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space number\n            a-rest ::= ( \",\" space additional-kv )*\n            additional-k ::= [\"] ( [a] char+ | [^\"a] char* )? [\"]\n            additional-kv ::= additional-k \":\" space number\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"{\" space  (a-kv a-rest | additional-kv ( \",\" space additional-kv )* )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "required + optional + additional props",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"properties\": {\n                \"and\": {\"type\": \"number\"},\n                \"also\": {\"type\": \"number\"}\n            },\n            \"required\": [\"and\"],\n            \"additionalProperties\": {\"type\": \"number\"}\n        }",
   "grammar": "\n            additional-k ::= [\"] ( [a] ([l] ([s] ([o] char+ | [^\"o] char*) | [^\"s] char*) | [n] ([d] char+ | [^\"d] char*) | [^\"ln] char*) | [^\"a] char* )? [\"]\n            additional-kv ::= additional-k \":\" space number\n            also-kv ::= \"\\\"also\\\"\" space \":\" space number\n            also-rest ::= ( \",\" space additional-kv )*\n            and-kv ::= \"\\\"and\\\"\" space \":\" space number\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"{\" space and-kv ( \",\" space ( also-kv also-rest | additional-kv ( \",\" space additional-kv )* ) )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "optional props with empty name",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"\": {\"type\": \"integer\"},\n                \"a\": {\"type\": \"integer\"}\n            },\n            \"additionalProperties\": {\"type\": \"integer\"}\n        }",
   "grammar": "\n            -kv ::= \"\\\"\\\"\" space \":\" space root\n            -rest ::= ( \",\" space a-kv )? a-rest\n            a-kv ::= \"\\\"a\\\"\" space \":\" space integer\n            a-rest ::= ( \",\" space additional-kv )*\n            additional-k ::= [\"] ( [a] char+ | [^\"a] char* ) [\"]\n            additional-kv ::= additional-k \":\" space integer\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            integer ::= (\"-\"? integral-part)\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            root ::= (\"-\"? integral-part)\n            root0 ::= \"{\" space  (-kv -rest | a-kv a-rest | additional-kv ( \",\" space additional-kv )* )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "optional props with nested names",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"a\": {\"type\": \"integer\"},\n                \"aa\": {\"type\": \"integer\"}\n            },\n            \"additionalProperties\": {\"type\": \"integer\"}\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space integer\n            a-rest ::= ( \",\" space aa-kv )? aa-rest\n            aa-kv ::= \"\\\"aa\\\"\" space \":\" space integer\n            aa-rest ::= ( \",\" space additional-kv )*\n            additional-k ::= [\"] ( [a] ([a] char+ | [^\"a] char*) | [^\"a] char* )? [\"]\n            additional-kv ::= additional-k \":\" space integer\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            integer ::= (\"-\"? integral-part)\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            root ::= \"{\" space  (a-kv a-rest | aa-kv aa-rest | additional-kv ( \",\" space additional-kv )* )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "optional props with common prefix",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"ab\": {\"type\": \"integer\"},\n                \"ac\": {\"type\": \"integer\"}\n            },\n            \"additionalProperties\": {\"type\": \"integer\"}\n        }",
   "grammar": "\n            ab-kv ::= \"\\\"ab\\\"\" space \":\" space integer\n            ab-rest ::= ( \",\" space ac-kv )? ac-rest\n            ac-kv ::= \"\\\"ac\\\"\" space \":\" space integer\n            ac-rest ::= ( \",\" space additional-kv )*\n            additional-k ::= [\"] ( [a] ([b] char+ | [c] char+ | [^\"bc] char*) | [^\"a] char* )? [\"]\n            additional-kv ::= additional-k \":\" space integer\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            integer ::= (\"-\"? integral-part)\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            root ::= \"{\" space  (ab-kv ab-rest | ac-kv ac-rest | additional-kv ( \",\" space additional-kv )* )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "top-level $ref",
   "success": true,
   "schema": "{\n            \"$ref\": \"#/definitions/foo\",\n            \"definitions\": {\n                \"foo\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"a\": {\n                            \"type\": \"string\"\n                        }\n                    },\n                    \"required\": [\n                        \"a\"\n                    ],\n                    \"additionalProperties\": false\n                }\n            }\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            ref-definitions-foo ::= \"{\" space ref-definitions-foo-a-kv space \"}\"\n            ref-definitions-foo-a-kv ::= \"\\\"a\\\"\" space \":\" space string\n            root ::= ref-definitions-foo\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "anyOf",
   "success": true,
   "schema": "{\n            \"anyOf\": [\n                {\"$ref\": \"#/definitions/foo\"},\n                {\"$ref\": \"#/definitions/bar\"}\n            ],\n            \"definitions\": {\n                \"foo\": {\n                    \"properties\": {\"a\": {\"type\": \"number\"}}\n                },\n                \"bar\": {\n                    \"properties\": {\"b\": {\"type\": \"number\"}}\n                }\n            },\n            \"type\": \"object\"\n        }",
   "grammar": "\n            alternative-0 ::= ref-definitions-foo\n            alternative-1 ::= ref-definitions-bar\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            ref-definitions-bar ::= \"{\" space  (ref-definitions-bar-b-kv )? space \"}\"\n            ref-definitions-bar-b-kv ::= \"\\\"b\\\"\" space \":\" space number\n            ref-definitions-foo ::= \"{\" space  (ref-definitions-foo-a-kv )? space \"}\"\n            ref-definitions-foo-a-kv ::= \"\\\"a\\\"\" space \":\" space number\n            root ::= alternative-0 | alternative-1\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "anyOf $ref",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"a\": {\n                    \"anyOf\": [\n                        {\"type\": \"string\"},\n                        {\"type\": \"number\"}\n                    ]\n                },\n                \"b\": {\n                    \"anyOf\": [\n                        {\"$ref\": \"#/properties/a/anyOf/0\"},\n                        {\"type\": \"boolean\"}\n                    ]\n                }\n            },\n            \"type\": \"object\"\n        }",
   "grammar": "\n            a ::= string | number\n            a-kv ::= \"\\\"a\\\"\" space \":\" space a\n            a-rest ::= ( \",\" space b-kv )?\n            b ::= b-0 | boolean\n            b-0 ::= string\n            b-kv ::= \"\\\"b\\\"\" space \":\" space b\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"{\" space  (a-kv a-rest | b-kv )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "mix of allOf, anyOf and $ref (similar to https://json.schemastore.org/tsconfig.json)",
   "success": true,
   "schema": "{\n            \"allOf\": [\n                {\"$ref\": \"#/definitions/foo\"},\n                {\"$ref\": \"#/definitions/bar\"},\n                {\n                \"anyOf\": [\n                    {\"$ref\": \"#/definitions/baz\"},\n                    {\"$ref\": \"#/definitions/bam\"}\n                ]\n                }\n            ],\n            \"definitions\": {\n                \"foo\": {\n                    \"properties\": {\"a\": {\"type\": \"number\"}}\n                },\n                \"bar\": {\n                    \"properties\": {\"b\": {\"type\": \"number\"}}\n                },\n                \"bam\": {\n                    \"properties\": {\"c\": {\"type\": \"number\"}}\n                },\n                \"baz\": {\n                    \"properties\": {\"d\": {\"type\": \"number\"}}\n                }\n            },\n            \"type\": \"object\"\n        }",
   "grammar": "\n            a-kv ::= \"\\\"a\\\"\" space \":\" space number\n            b-kv ::= \"\\\"b\\\"\" space \":\" space number\n            c-kv ::= \"\\\"c\\\"\" space \":\" space number\n            d-kv ::= \"\\\"d\\\"\" space \":\" space number\n            d-rest ::= ( \",\" space c-kv )?\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            root ::= \"{\" space a-kv \",\" space b-kv ( \",\" space ( d-kv d-rest | c-kv ) )? space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "allOf with enum schema",
   "success": true,
   "schema": "{\n            \"allOf\": [\n                {\"$ref\": \"#/definitions/foo\"}\n            ],\n            \"definitions\": {\n                \"foo\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"a\", \"b\"]\n                }\n            }\n        }",
   "grammar": "\n            root ::= (\"\\\"a\\\"\" | \"\\\"b\\\"\")\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "allOf with multiple enum schemas",
   "success": true,
   "schema": "{\n            \"allOf\": [\n                {\"$ref\": \"#/definitions/foo\"},\n                {\"$ref\": \"#/definitions/bar\"}\n            ],\n            \"definitions\": {\n                \"foo\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"a\", \"b\", \"c\"]\n                },\n                \"bar\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"b\", \"c\", \"d\"]\n                }\n            }\n        }",
   "grammar": "\n            root ::= (\"\\\"b\\\"\" | \"\\\"c\\\"\")\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "conflicting names",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"properties\": {\n                \"number\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"number\": {\n                    \"type\": \"object\",\n                        \"properties\": {\n                            \"root\": {\n                                \"type\": \"number\"\n                            }\n                        },\n                        \"required\": [\n                            \"root\"\n                        ],\n                        \"additionalProperties\": false\n                    }\n                },\n                \"required\": [\n                    \"number\"\n                ],\n                \"additionalProperties\": false\n                }\n            },\n            \"required\": [\n                \"number\"\n            ],\n            \"additionalProperties\": false,\n            \"definitions\": {}\n        }",
   "grammar": "\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            number- ::= \"{\" space number-number-kv space \"}\"\n            number-kv ::= \"\\\"number\\\"\" space \":\" space number-\n            number-number ::= \"{\" space number-number-root-kv space \"}\"\n            number-number-kv ::= \"\\\"number\\\"\" space \":\" space number-number\n            number-number-root-kv ::= \"\\\"root\\\"\" space \":\" space number\n            root ::= \"{\" space number-kv space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "description only (no type) treated as unconstrained",
   "success": true,
   "schema": "{\"description\": \"The 0-based index of the last line to be retrieved (inclusive). If None, read until the end of the file.\"}",
   "grammar": "\n            array ::= \"[\" space ( value (\",\" space value)* )? space \"]\"\n            boolean ::= (\"true\" | \"false\")\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            decimal-part ::= [0-9]{1,16}\n            integral-part ::= [0] | [1-9] [0-9]{0,15}\n            null ::= \"null\"\n            number ::= (\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)?\n            object ::= \"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? space \"}\"\n            root ::= value\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n            value ::= object | array | string | number | boolean | null\n        "
  },
  {
   "name": "literal string with escapes",
   "success": true,
   "schema": "{\n            \"properties\": {\n                \"code\": {\n                    \"const\": \" \\r \\n \\\" \\\\ \",\n                    \"description\": \"Generated code\",\n                    \"title\": \"Code\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"code\"\n            ],\n            \"title\": \"DecoderResponse\",\n            \"type\": \"object\"\n        }",
   "grammar": "\n            code ::= \"\\\" \\\\r \\\\n \\\\\\\" \\\\\\\\ \\\"\"\n            code-kv ::= \"\\\"code\\\"\" space \":\" space code\n            root ::= \"{\" space code-kv space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp with non-capturing group",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^(?:foo|bar)baz$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" ((\"foo\" | \"bar\") \"baz\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp with nested non-capturing groups",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^(?:(?:ab)+c)?d$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" (((\"ab\")+ \"c\")? \"d\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "unanchored regexp",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"[0-9]+\"\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= string\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "regexp with unsupported shorthand",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^[0-9]{3}\\\\w$\"\n        }",
   "grammar": "\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= string\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  },
  {
   "name": "regexp with escaped hyphen in a character class",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z\\\\-]+$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" ([a-z\\-]+) \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp with escaped hyphen outside a character class",
   "success": true,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^a\\\\-b$\"\n        }",
   "grammar": "\n            root ::= \"\\\"\" (\"a\\-b\") \"\\\"\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n        "
  },
  {
   "name": "regexp with unbalanced parentheses",
   "success": false,
   "schema": "{\n            \"type\": \"string\",\n            \"pattern\": \"^(a$\"\n        }",
   "grammar": ""
  },
  {
   "name": "unsupported regexp in a property",
   "success": true,
   "schema": "{\n            \"type\": \"object\",\n            \"properties\": {\n                \"a\": { \"type\": \"string\", \"pattern\": \"^(?=a)a$\" }\n            },\n            \"required\": [\"a\"],\n            \"additionalProperties\": false\n        }",
   "grammar": "\n            a ::= string\n            a-kv ::= \"\\\"a\\\"\" space \":\" space a\n            char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n            root ::= \"{\" space a-kv space \"}\"\n            space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n            string ::= \"\\\"\" char* \"\\\"\"\n        "
  }
 ]
}