edn_turbo 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 409d493aab7167c3bac13a53580bea45735c02fc1918f57fd5b386a390d43750
4
- data.tar.gz: 3c9b3786db7a9b2f7732735898b3b78c7dfab041b3f11511d8866b7093629cf5
3
+ metadata.gz: 695a3c68e9f69b9423a4da07056dfd8f264f62b39896c938938e56d1e28c395f
4
+ data.tar.gz: a370c5b31f462288fd340771c901d47f27e45e2308ef98728cb6abe59596631a
5
5
  SHA512:
6
- metadata.gz: a1b753f68eadd7e5466dd863606085dd8eeaa489c01e0ef5473ccb9e5562d70611ff35999db5263ffef42813a1404f118f26672482b36e7ca2e8fde50e96d187
7
- data.tar.gz: d0ab9b94babb9c4d0293f270266963555e805edbaf09a28c55de59281fba52e6fb6cb0af189eecd4daa96029d254d5521d1fa916d3f91ff9e2c638b4cbc7c08b
6
+ metadata.gz: 9b9b5aeb7c5b62d4add2ff2faa190138cf1baf0e902bdf3a28468c382ef0e94f6c95f93e3e05c48d7deb31e708d92f41607da60183b510593aa741eb68817be5
7
+ data.tar.gz: 39fb3b6b18cf3593fd537843aa2a08089552cb8900691ca88e3d8a86d05706e5f5ef557c8f3521c0b68b812652d1770f5f3a4621ca30087fa06299266a330352
@@ -1,6 +1,17 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/).
3
3
 
4
+ ## 0.6.1 - 2019-05-20
5
+ ### Added
6
+ - Implement parsing of Ratio literals, represented as a ruby Rational.
7
+
8
+ ### Fixed
9
+ - Parsing of exact precision types.
10
+
11
+ ### Changed
12
+ - Build lists using EDN::list method that was previously broken.
13
+
14
+
4
15
  ## 0.6.0 - 2019-05-13
5
16
  ### Changed
6
17
  - switched from MiniTest to RSpec.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
- edn_turbo 0.6.0
1
+ edn_turbo 0.6.1
2
2
  ===============
3
3
 
4
- Fast (Ragel)[http://www.colm.net/open-source/ragel/]-based EDN parser for Ruby.
4
+ Fast [Ragel](http://www.colm.net/open-source/ragel/)-based EDN parser for Ruby.
5
5
 
6
6
  `edn_turbo` can be used as a parser plugin for
7
7
  [edn](https://github.com/relevance/edn-ruby). With a few exceptions
@@ -66,10 +66,10 @@ the API is the same as the edn gem.
66
66
  # also accepts a string
67
67
  pp EDN.read("[ 1 2 3 abc ]")
68
68
 
69
- # metadata
70
- e = EDN.read('^String ^:foo ^{:foo false :tag Boolean :bar 2} [1 2]')
71
- pp e # -> [1, 2]
72
- pp e.metadata # -> {:foo=>true, :tag=>#<EDN::Type::Symbol:0x007fdbea8a29b0 @symbol=:String>, :bar=>2}
69
+ # metadata
70
+ e = EDN.read('^String ^:foo ^{:foo false :tag Boolean :bar 2} [1 2]')
71
+ pp e # -> [1, 2]
72
+ pp e.metadata # -> {:foo=>true, :tag=>#<EDN::Type::Symbol:0x007fdbea8a29b0 @symbol=:String>, :bar=>2}
73
73
 
74
74
  ```
75
75
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  set -e
4
4
 
5
- if [[ $# -ne 1 ]]; then
5
+ if [[ $# -eq 0 ]]; then
6
6
  RUBY_VERSION=2.6.3
7
7
  else
8
8
  RUBY_VERSION=$1
@@ -59,14 +59,14 @@ static const int EDN_value_error = 0;
59
59
  static const int EDN_value_en_main = 1;
60
60
 
61
61
 
62
- #line 197 "edn_parser.rl"
62
+ #line 202 "edn_parser.rl"
63
63
 
64
64
 
65
65
 
66
66
  const char *edn::Parser::parse_value(const char *p, const char *pe, VALUE& v)
67
67
  {
68
- // std::cerr << __FUNCTION__ << "() p: \"" << p << "\"" << std::endl;
69
- int cs;
68
+ // std::cerr << __FUNCTION__ << "() p: \"" << p << "\"" << std::endl;
69
+ int cs;
70
70
 
71
71
 
72
72
  #line 73 "edn_parser.cc"
@@ -74,7 +74,7 @@ const char *edn::Parser::parse_value(const char *p, const char *pe, VALUE& v)
74
74
  cs = EDN_value_start;
75
75
  }
76
76
 
77
- #line 206 "edn_parser.rl"
77
+ #line 211 "edn_parser.rl"
78
78
 
79
79
  #line 80 "edn_parser.cc"
80
80
  {
@@ -119,116 +119,121 @@ st0:
119
119
  cs = 0;
120
120
  goto _out;
121
121
  tr0:
122
- #line 125 "edn_parser.rl"
122
+ #line 130 "edn_parser.rl"
123
123
  {
124
- // stand-alone operators *, +, -, etc.
125
- const char *np = parse_operator(p, pe, v);
126
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
127
- }
124
+ // stand-alone operators *, +, -, etc.
125
+ const char *np = parse_operator(p, pe, v);
126
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
127
+ }
128
128
  goto st2;
129
129
  tr2:
130
130
  #line 93 "edn_parser.rl"
131
131
  {
132
- // string types within double-quotes
133
- const char *np = parse_string(p, pe, v);
134
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
135
- }
132
+ // string types within double-quotes
133
+ const char *np = parse_string(p, pe, v);
134
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
135
+ }
136
136
  goto st2;
137
137
  tr3:
138
- #line 177 "edn_parser.rl"
138
+ #line 182 "edn_parser.rl"
139
139
  {
140
- // handles tokens w/ leading # ("#_", "#{", and tagged elems)
141
- const char *np = parse_dispatch(p + 1, pe, v);
142
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
143
- }
140
+ // handles tokens w/ leading # ("#_", "#{", and tagged elems)
141
+ const char *np = parse_dispatch(p + 1, pe, v);
142
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
143
+ }
144
144
  goto st2;
145
145
  tr4:
146
- #line 159 "edn_parser.rl"
146
+ #line 164 "edn_parser.rl"
147
147
  {
148
- // (
149
- const char *np = parse_list(p, pe, v);
150
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
151
- }
148
+ // (
149
+ const char *np = parse_list(p, pe, v);
150
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
151
+ }
152
152
  goto st2;
153
153
  tr5:
154
154
  #line 105 "edn_parser.rl"
155
155
  {
156
- // tokens w/ leading digits: non-negative integers & decimals.
157
- // try to parse a decimal first
158
- const char *np = parse_decimal(p, pe, v);
159
- if (np == nullptr) {
160
- // if we can't, try to parse it as an int
156
+ // tokens w/ leading digits: non-negative integers & decimals.
157
+ // try to parse a decimal first
158
+ const char *np = parse_decimal(p, pe, v);
159
+ if (np == nullptr) {
160
+ // if we can't, try to parse it as a ratio
161
+ np = parse_ratio(p, pe, v);
162
+
163
+ // otherwise, an int
164
+ if (np == nullptr) {
161
165
  np = parse_integer(p, pe, v);
162
- }
163
-
164
- if (np) {
165
- {p = (( np))-1;}
166
- p--;
167
- {p++; cs = 2; goto _out;}
168
- }
169
- else {
170
- error(__FUNCTION__, "number format error", *p);
171
- {p = (( pe))-1;}
172
- }
173
- }
166
+ }
167
+ }
168
+
169
+ if (np) {
170
+ {p = (( np))-1;}
171
+ p--;
172
+ {p++; cs = 2; goto _out;}
173
+ }
174
+ else {
175
+ error(__FUNCTION__, "number format error", *p);
176
+ {p = (( pe))-1;}
177
+ }
178
+ }
174
179
  goto st2;
175
180
  tr6:
176
181
  #line 99 "edn_parser.rl"
177
182
  {
178
- // tokens with a leading ':'
179
- const char *np = parse_keyword(p, pe, v);
180
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
181
- }
183
+ // tokens with a leading ':'
184
+ const char *np = parse_keyword(p, pe, v);
185
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
186
+ }
182
187
  goto st2;
183
188
  tr7:
184
- #line 137 "edn_parser.rl"
185
- {
186
- // user identifiers and reserved keywords (true, false, nil)
187
- VALUE sym = Qnil;
188
- const char *np = parse_symbol(p, pe, sym);
189
- if (np == nullptr) { {p = (( pe))-1;} } else {
190
- // parse_symbol will make 'sym' a ruby string
191
- if (std::strcmp(RSTRING_PTR(sym), "true") == 0) { v = Qtrue; }
192
- else if (std::strcmp(RSTRING_PTR(sym), "false") == 0) { v = Qfalse; }
193
- else if (std::strcmp(RSTRING_PTR(sym), "nil") == 0) { v = Qnil; }
194
- else {
195
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
196
- }
197
- {p = (( np))-1;}
198
- }
199
- }
189
+ #line 142 "edn_parser.rl"
190
+ {
191
+ // user identifiers and reserved keywords (true, false, nil)
192
+ VALUE sym = Qnil;
193
+ const char *np = parse_symbol(p, pe, sym);
194
+ if (np == nullptr) { {p = (( pe))-1;} } else {
195
+ // parse_symbol will make 'sym' a ruby string
196
+ if (std::strcmp(RSTRING_PTR(sym), "true") == 0) { v = Qtrue; }
197
+ else if (std::strcmp(RSTRING_PTR(sym), "false") == 0) { v = Qfalse; }
198
+ else if (std::strcmp(RSTRING_PTR(sym), "nil") == 0) { v = Qnil; }
199
+ else {
200
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
201
+ }
202
+ {p = (( np))-1;}
203
+ }
204
+ }
200
205
  goto st2;
201
206
  tr8:
202
- #line 153 "edn_parser.rl"
207
+ #line 158 "edn_parser.rl"
203
208
  {
204
- // [
205
- const char *np = parse_vector(p, pe, v);
206
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
207
- }
209
+ // [
210
+ const char *np = parse_vector(p, pe, v);
211
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
212
+ }
208
213
  goto st2;
209
214
  tr9:
210
- #line 131 "edn_parser.rl"
215
+ #line 136 "edn_parser.rl"
211
216
  {
212
- // tokens w/ leading \ (escaped characters \newline, \c, etc.)
213
- const char *np = parse_esc_char(p, pe, v);
214
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
215
- }
217
+ // tokens w/ leading \ (escaped characters \newline, \c, etc.)
218
+ const char *np = parse_esc_char(p, pe, v);
219
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
220
+ }
216
221
  goto st2;
217
222
  tr10:
218
- #line 171 "edn_parser.rl"
223
+ #line 176 "edn_parser.rl"
219
224
  {
220
- // ^
221
- const char *np = parse_meta(p, pe);
222
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
223
- }
225
+ // ^
226
+ const char *np = parse_meta(p, pe);
227
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
228
+ }
224
229
  goto st2;
225
230
  tr11:
226
- #line 165 "edn_parser.rl"
231
+ #line 170 "edn_parser.rl"
227
232
  {
228
- // {
229
- const char *np = parse_map(p, pe, v);
230
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
231
- }
233
+ // {
234
+ const char *np = parse_map(p, pe, v);
235
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
236
+ }
232
237
  goto st2;
233
238
  st2:
234
239
  if ( ++p == pe )
@@ -236,7 +241,7 @@ st2:
236
241
  case 2:
237
242
  #line 80 "edn_parser.rl"
238
243
  { p--; {p++; cs = 2; goto _out;} }
239
- #line 240 "edn_parser.cc"
244
+ #line 245 "edn_parser.cc"
240
245
  goto st0;
241
246
  }
242
247
  _test_eof2: cs = 2; goto _test_eof;
@@ -245,17 +250,17 @@ case 2:
245
250
  _out: {}
246
251
  }
247
252
 
248
- #line 207 "edn_parser.rl"
253
+ #line 212 "edn_parser.rl"
249
254
 
250
- if (cs >= EDN_value_first_final) {
251
- return p;
252
- }
253
- else if (cs == EDN_value_error) {
254
- error(__FUNCTION__, "token error", *p);
255
- return pe;
256
- }
257
- else if (cs == EDN_value_en_main) {} // silence ragel warning
258
- return nullptr;
255
+ if (cs >= EDN_value_first_final) {
256
+ return p;
257
+ }
258
+ else if (cs == EDN_value_error) {
259
+ error(__FUNCTION__, "token error", *p);
260
+ return pe;
261
+ }
262
+ else if (cs == EDN_value_en_main) {} // silence ragel warning
263
+ return nullptr;
259
264
  }
260
265
 
261
266
 
@@ -267,7 +272,7 @@ case 2:
267
272
  // ascii range is found.
268
273
  //
269
274
 
270
- #line 271 "edn_parser.cc"
275
+ #line 276 "edn_parser.cc"
271
276
  static const int EDN_string_start = 1;
272
277
  static const int EDN_string_first_final = 8;
273
278
  static const int EDN_string_error = 0;
@@ -275,26 +280,26 @@ static const int EDN_string_error = 0;
275
280
  static const int EDN_string_en_main = 1;
276
281
 
277
282
 
278
- #line 252 "edn_parser.rl"
283
+ #line 257 "edn_parser.rl"
279
284
 
280
285
 
281
286
 
282
287
  const char* edn::Parser::parse_string(const char *p, const char *pe, VALUE& v)
283
288
  {
284
- static const char* EDN_TYPE = "string";
285
- int cs;
286
- bool encode = false;
289
+ static const char* EDN_TYPE = "string";
290
+ int cs;
291
+ bool encode = false;
287
292
 
288
293
 
289
- #line 290 "edn_parser.cc"
294
+ #line 295 "edn_parser.cc"
290
295
  {
291
296
  cs = EDN_string_start;
292
297
  }
293
298
 
294
- #line 262 "edn_parser.rl"
295
- const char* p_save = p;
299
+ #line 267 "edn_parser.rl"
300
+ const char* p_save = p;
296
301
 
297
- #line 298 "edn_parser.cc"
302
+ #line 303 "edn_parser.cc"
298
303
  {
299
304
  if ( p == pe )
300
305
  goto _test_eof;
@@ -308,16 +313,16 @@ st0:
308
313
  cs = 0;
309
314
  goto _out;
310
315
  tr2:
311
- #line 241 "edn_parser.rl"
316
+ #line 246 "edn_parser.rl"
312
317
  {
313
- encode = true;
314
- }
318
+ encode = true;
319
+ }
315
320
  goto st2;
316
321
  st2:
317
322
  if ( ++p == pe )
318
323
  goto _test_eof2;
319
324
  case 2:
320
- #line 321 "edn_parser.cc"
325
+ #line 326 "edn_parser.cc"
321
326
  switch( (*p) ) {
322
327
  case 34: goto tr3;
323
328
  case 92: goto tr4;
@@ -326,14 +331,14 @@ case 2:
326
331
  goto tr2;
327
332
  goto st2;
328
333
  tr3:
329
- #line 233 "edn_parser.rl"
330
- {
331
- if (edn::util::parse_byte_stream(p_save + 1, p, v, encode)) {
332
- {p = (( p + 1))-1;}
333
- } else {
334
- p--; {p++; cs = 8; goto _out;}
335
- }
336
- }
334
+ #line 238 "edn_parser.rl"
335
+ {
336
+ if (edn::util::parse_byte_stream(p_save + 1, p, v, encode)) {
337
+ {p = (( p + 1))-1;}
338
+ } else {
339
+ p--; {p++; cs = 8; goto _out;}
340
+ }
341
+ }
337
342
  #line 80 "edn_parser.rl"
338
343
  { p--; {p++; cs = 8; goto _out;} }
339
344
  goto st8;
@@ -341,19 +346,19 @@ st8:
341
346
  if ( ++p == pe )
342
347
  goto _test_eof8;
343
348
  case 8:
344
- #line 345 "edn_parser.cc"
349
+ #line 350 "edn_parser.cc"
345
350
  goto st0;
346
351
  tr4:
347
- #line 241 "edn_parser.rl"
352
+ #line 246 "edn_parser.rl"
348
353
  {
349
- encode = true;
350
- }
354
+ encode = true;
355
+ }
351
356
  goto st3;
352
357
  st3:
353
358
  if ( ++p == pe )
354
359
  goto _test_eof3;
355
360
  case 3:
356
- #line 357 "edn_parser.cc"
361
+ #line 362 "edn_parser.cc"
357
362
  switch( (*p) ) {
358
363
  case 34: goto tr2;
359
364
  case 47: goto tr2;
@@ -367,16 +372,16 @@ case 3:
367
372
  }
368
373
  goto st2;
369
374
  tr5:
370
- #line 241 "edn_parser.rl"
375
+ #line 246 "edn_parser.rl"
371
376
  {
372
- encode = true;
373
- }
377
+ encode = true;
378
+ }
374
379
  goto st4;
375
380
  st4:
376
381
  if ( ++p == pe )
377
382
  goto _test_eof4;
378
383
  case 4:
379
- #line 380 "edn_parser.cc"
384
+ #line 385 "edn_parser.cc"
380
385
  if ( (*p) < 65 ) {
381
386
  if ( 48 <= (*p) && (*p) <= 57 )
382
387
  goto tr6;
@@ -387,16 +392,16 @@ case 4:
387
392
  goto tr6;
388
393
  goto st0;
389
394
  tr6:
390
- #line 241 "edn_parser.rl"
395
+ #line 246 "edn_parser.rl"
391
396
  {
392
- encode = true;
393
- }
397
+ encode = true;
398
+ }
394
399
  goto st5;
395
400
  st5:
396
401
  if ( ++p == pe )
397
402
  goto _test_eof5;
398
403
  case 5:
399
- #line 400 "edn_parser.cc"
404
+ #line 405 "edn_parser.cc"
400
405
  if ( (*p) < 65 ) {
401
406
  if ( 48 <= (*p) && (*p) <= 57 )
402
407
  goto tr7;
@@ -407,16 +412,16 @@ case 5:
407
412
  goto tr7;
408
413
  goto st0;
409
414
  tr7:
410
- #line 241 "edn_parser.rl"
415
+ #line 246 "edn_parser.rl"
411
416
  {
412
- encode = true;
413
- }
417
+ encode = true;
418
+ }
414
419
  goto st6;
415
420
  st6:
416
421
  if ( ++p == pe )
417
422
  goto _test_eof6;
418
423
  case 6:
419
- #line 420 "edn_parser.cc"
424
+ #line 425 "edn_parser.cc"
420
425
  if ( (*p) < 65 ) {
421
426
  if ( 48 <= (*p) && (*p) <= 57 )
422
427
  goto tr8;
@@ -427,16 +432,16 @@ case 6:
427
432
  goto tr8;
428
433
  goto st0;
429
434
  tr8:
430
- #line 241 "edn_parser.rl"
435
+ #line 246 "edn_parser.rl"
431
436
  {
432
- encode = true;
433
- }
437
+ encode = true;
438
+ }
434
439
  goto st7;
435
440
  st7:
436
441
  if ( ++p == pe )
437
442
  goto _test_eof7;
438
443
  case 7:
439
- #line 440 "edn_parser.cc"
444
+ #line 445 "edn_parser.cc"
440
445
  if ( (*p) < 65 ) {
441
446
  if ( 48 <= (*p) && (*p) <= 57 )
442
447
  goto tr2;
@@ -462,29 +467,29 @@ case 7:
462
467
  case 2:
463
468
  #line 73 "edn_parser.rl"
464
469
  {
465
- std::stringstream s;
466
- s << "unterminated " << EDN_TYPE;
467
- error(__FUNCTION__, s.str());
468
- p--; {p++; cs = 0; goto _out;}
469
- }
470
+ std::stringstream s;
471
+ s << "unterminated " << EDN_TYPE;
472
+ error(__FUNCTION__, s.str());
473
+ p--; {p++; cs = 0; goto _out;}
474
+ }
470
475
  break;
471
- #line 472 "edn_parser.cc"
476
+ #line 477 "edn_parser.cc"
472
477
  }
473
478
  }
474
479
 
475
480
  _out: {}
476
481
  }
477
482
 
478
- #line 264 "edn_parser.rl"
483
+ #line 269 "edn_parser.rl"
479
484
 
480
- if (cs >= EDN_string_first_final) {
481
- return p + 1;
482
- }
483
- else if (cs == EDN_string_error) {
484
- return pe;
485
- }
486
- else if (cs == EDN_string_en_main) {} // silence ragel warning
487
- return nullptr;
485
+ if (cs >= EDN_string_first_final) {
486
+ return p + 1;
487
+ }
488
+ else if (cs == EDN_string_error) {
489
+ return pe;
490
+ }
491
+ else if (cs == EDN_string_en_main) {} // silence ragel warning
492
+ return nullptr;
488
493
  }
489
494
 
490
495
 
@@ -493,7 +498,7 @@ case 7:
493
498
  // keyword parsing
494
499
  //
495
500
 
496
- #line 497 "edn_parser.cc"
501
+ #line 502 "edn_parser.cc"
497
502
  static const int EDN_keyword_start = 1;
498
503
  static const int EDN_keyword_first_final = 3;
499
504
  static const int EDN_keyword_error = 0;
@@ -501,24 +506,24 @@ static const int EDN_keyword_error = 0;
501
506
  static const int EDN_keyword_en_main = 1;
502
507
 
503
508
 
504
- #line 294 "edn_parser.rl"
509
+ #line 299 "edn_parser.rl"
505
510
 
506
511
 
507
512
 
508
513
  const char* edn::Parser::parse_keyword(const char *p, const char *pe, VALUE& v)
509
514
  {
510
- int cs;
515
+ int cs;
511
516
 
512
517
 
513
- #line 514 "edn_parser.cc"
518
+ #line 519 "edn_parser.cc"
514
519
  {
515
520
  cs = EDN_keyword_start;
516
521
  }
517
522
 
518
- #line 302 "edn_parser.rl"
519
- const char* p_save = p;
523
+ #line 307 "edn_parser.rl"
524
+ const char* p_save = p;
520
525
 
521
- #line 522 "edn_parser.cc"
526
+ #line 527 "edn_parser.cc"
522
527
  {
523
528
  if ( p == pe )
524
529
  goto _test_eof;
@@ -592,7 +597,7 @@ st4:
592
597
  if ( ++p == pe )
593
598
  goto _test_eof4;
594
599
  case 4:
595
- #line 596 "edn_parser.cc"
600
+ #line 601 "edn_parser.cc"
596
601
  goto st0;
597
602
  st5:
598
603
  if ( ++p == pe )
@@ -631,55 +636,54 @@ case 5:
631
636
  _out: {}
632
637
  }
633
638
 
634
- #line 304 "edn_parser.rl"
635
-
636
- if (cs >= EDN_keyword_first_final) {
637
- std::string buf;
638
- uintmax_t len = p - p_save;
639
- // don't include leading ':' because the ruby symbol will handle it
640
- buf.append(p_save + 1, len - 1);
641
- v = ID2SYM(rb_intern(buf.c_str()));
642
- return p;
643
- }
644
- else if (cs == EDN_keyword_error) {
645
- error(__FUNCTION__, "invalid keyword", *p);
646
- return pe;
647
- }
648
- else if (cs == EDN_keyword_en_main) {} // silence ragel warning
649
- return nullptr;
639
+ #line 309 "edn_parser.rl"
640
+
641
+ if (cs >= EDN_keyword_first_final) {
642
+ std::string buf;
643
+ uintmax_t len = p - p_save;
644
+ // don't include leading ':' because the ruby symbol will handle it
645
+ buf.append(p_save + 1, len - 1);
646
+ v = ID2SYM(rb_intern(buf.c_str()));
647
+ return p;
648
+ }
649
+ else if (cs == EDN_keyword_error) {
650
+ error(__FUNCTION__, "invalid keyword", *p);
651
+ return pe;
652
+ }
653
+ else if (cs == EDN_keyword_en_main) {} // silence ragel warning
654
+ return nullptr;
650
655
  }
651
656
 
652
657
 
653
-
654
658
  // ============================================================
655
659
  // decimal parsing machine
656
660
  //
657
661
 
658
- #line 659 "edn_parser.cc"
662
+ #line 663 "edn_parser.cc"
659
663
  static const int EDN_decimal_start = 1;
660
664
  static const int EDN_decimal_first_final = 9;
661
665
 
662
666
  static const int EDN_decimal_en_main = 1;
663
667
 
664
668
 
665
- #line 337 "edn_parser.rl"
669
+ #line 341 "edn_parser.rl"
666
670
 
667
671
 
668
672
 
669
673
  const char* edn::Parser::parse_decimal(const char *p, const char *pe, VALUE& v)
670
674
  {
671
- int cs;
675
+ int cs;
672
676
 
673
677
 
674
- #line 675 "edn_parser.cc"
678
+ #line 679 "edn_parser.cc"
675
679
  {
676
680
  cs = EDN_decimal_start;
677
681
  }
678
682
 
679
- #line 345 "edn_parser.rl"
680
- const char* p_save = p;
683
+ #line 349 "edn_parser.rl"
684
+ const char* p_save = p;
681
685
 
682
- #line 683 "edn_parser.cc"
686
+ #line 687 "edn_parser.cc"
683
687
  {
684
688
  if ( p == pe )
685
689
  goto _test_eof;
@@ -740,7 +744,7 @@ st10:
740
744
  if ( ++p == pe )
741
745
  goto _test_eof10;
742
746
  case 10:
743
- #line 744 "edn_parser.cc"
747
+ #line 748 "edn_parser.cc"
744
748
  goto st0;
745
749
  st4:
746
750
  if ( ++p == pe )
@@ -856,14 +860,14 @@ case 8:
856
860
  _out: {}
857
861
  }
858
862
 
859
- #line 347 "edn_parser.rl"
863
+ #line 351 "edn_parser.rl"
860
864
 
861
- if (cs >= EDN_decimal_first_final) {
862
- v = edn::util::float_to_ruby(p_save, p - p_save);
863
- return p + 1;
864
- }
865
- else if (cs == EDN_decimal_en_main) {} // silence ragel warning
866
- return nullptr;
865
+ if (cs >= EDN_decimal_first_final) {
866
+ v = edn::util::float_to_ruby(p_save, p - p_save);
867
+ return p + 1;
868
+ }
869
+ else if (cs == EDN_decimal_en_main) {} // silence ragel warning
870
+ return nullptr;
867
871
  }
868
872
 
869
873
 
@@ -871,30 +875,30 @@ case 8:
871
875
  // integer parsing machine - M suffix will return a BigNum
872
876
  //
873
877
 
874
- #line 875 "edn_parser.cc"
878
+ #line 879 "edn_parser.cc"
875
879
  static const int EDN_integer_start = 1;
876
880
  static const int EDN_integer_first_final = 3;
877
881
 
878
882
  static const int EDN_integer_en_main = 1;
879
883
 
880
884
 
881
- #line 370 "edn_parser.rl"
885
+ #line 374 "edn_parser.rl"
882
886
 
883
887
 
884
888
  const char* edn::Parser::parse_integer(const char *p, const char *pe, VALUE& v)
885
889
  {
886
- int cs;
890
+ int cs;
887
891
 
888
892
 
889
- #line 890 "edn_parser.cc"
893
+ #line 894 "edn_parser.cc"
890
894
  {
891
895
  cs = EDN_integer_start;
892
896
  }
893
897
 
894
- #line 377 "edn_parser.rl"
895
- const char* p_save = p;
898
+ #line 381 "edn_parser.rl"
899
+ const char* p_save = p;
896
900
 
897
- #line 898 "edn_parser.cc"
901
+ #line 902 "edn_parser.cc"
898
902
  {
899
903
  if ( p == pe )
900
904
  goto _test_eof;
@@ -943,7 +947,7 @@ st4:
943
947
  if ( ++p == pe )
944
948
  goto _test_eof4;
945
949
  case 4:
946
- #line 947 "edn_parser.cc"
950
+ #line 951 "edn_parser.cc"
947
951
  goto st0;
948
952
  st5:
949
953
  if ( ++p == pe )
@@ -984,17 +988,152 @@ case 6:
984
988
  _out: {}
985
989
  }
986
990
 
987
- #line 379 "edn_parser.rl"
991
+ #line 383 "edn_parser.rl"
988
992
 
989
- if (cs >= EDN_integer_first_final) {
990
- v = edn::util::integer_to_ruby(p_save, p - p_save);
991
- return p + 1;
992
- }
993
- else if (cs == EDN_integer_en_main) {} // silence ragel warning
994
- return nullptr;
993
+ if (cs >= EDN_integer_first_final) {
994
+ v = edn::util::integer_to_ruby(p_save, p - p_save);
995
+ return p + 1;
996
+ }
997
+ else if (cs == EDN_integer_en_main) {} // silence ragel warning
998
+ return nullptr;
995
999
  }
996
1000
 
997
1001
 
1002
+ // ============================================================
1003
+ // ratio parsing machine
1004
+ //
1005
+
1006
+ #line 1007 "edn_parser.cc"
1007
+ static const int EDN_ratio_start = 1;
1008
+ static const int EDN_ratio_first_final = 6;
1009
+
1010
+ static const int EDN_ratio_en_main = 1;
1011
+
1012
+
1013
+ #line 406 "edn_parser.rl"
1014
+
1015
+
1016
+
1017
+ const char* edn::Parser::parse_ratio(const char *p, const char *pe, VALUE& v)
1018
+ {
1019
+ int cs;
1020
+
1021
+
1022
+ #line 1023 "edn_parser.cc"
1023
+ {
1024
+ cs = EDN_ratio_start;
1025
+ }
1026
+
1027
+ #line 414 "edn_parser.rl"
1028
+ const char* p_save = p;
1029
+
1030
+ #line 1031 "edn_parser.cc"
1031
+ {
1032
+ if ( p == pe )
1033
+ goto _test_eof;
1034
+ switch ( cs )
1035
+ {
1036
+ case 1:
1037
+ switch( (*p) ) {
1038
+ case 43: goto st2;
1039
+ case 45: goto st2;
1040
+ case 48: goto st3;
1041
+ }
1042
+ if ( 49 <= (*p) && (*p) <= 57 )
1043
+ goto st5;
1044
+ goto st0;
1045
+ st0:
1046
+ cs = 0;
1047
+ goto _out;
1048
+ st2:
1049
+ if ( ++p == pe )
1050
+ goto _test_eof2;
1051
+ case 2:
1052
+ if ( (*p) == 48 )
1053
+ goto st3;
1054
+ if ( 49 <= (*p) && (*p) <= 57 )
1055
+ goto st5;
1056
+ goto st0;
1057
+ st3:
1058
+ if ( ++p == pe )
1059
+ goto _test_eof3;
1060
+ case 3:
1061
+ if ( (*p) == 47 )
1062
+ goto st4;
1063
+ goto st0;
1064
+ st4:
1065
+ if ( ++p == pe )
1066
+ goto _test_eof4;
1067
+ case 4:
1068
+ if ( (*p) == 48 )
1069
+ goto st6;
1070
+ if ( 49 <= (*p) && (*p) <= 57 )
1071
+ goto st8;
1072
+ goto st0;
1073
+ st6:
1074
+ if ( ++p == pe )
1075
+ goto _test_eof6;
1076
+ case 6:
1077
+ switch( (*p) ) {
1078
+ case 43: goto st0;
1079
+ case 45: goto st0;
1080
+ }
1081
+ if ( 47 <= (*p) && (*p) <= 57 )
1082
+ goto st0;
1083
+ goto tr7;
1084
+ tr7:
1085
+ #line 80 "edn_parser.rl"
1086
+ { p--; {p++; cs = 7; goto _out;} }
1087
+ goto st7;
1088
+ st7:
1089
+ if ( ++p == pe )
1090
+ goto _test_eof7;
1091
+ case 7:
1092
+ #line 1093 "edn_parser.cc"
1093
+ goto st0;
1094
+ st8:
1095
+ if ( ++p == pe )
1096
+ goto _test_eof8;
1097
+ case 8:
1098
+ switch( (*p) ) {
1099
+ case 43: goto st0;
1100
+ case 45: goto st0;
1101
+ case 47: goto st0;
1102
+ }
1103
+ if ( 48 <= (*p) && (*p) <= 57 )
1104
+ goto st8;
1105
+ goto tr7;
1106
+ st5:
1107
+ if ( ++p == pe )
1108
+ goto _test_eof5;
1109
+ case 5:
1110
+ if ( (*p) == 47 )
1111
+ goto st4;
1112
+ if ( 48 <= (*p) && (*p) <= 57 )
1113
+ goto st5;
1114
+ goto st0;
1115
+ }
1116
+ _test_eof2: cs = 2; goto _test_eof;
1117
+ _test_eof3: cs = 3; goto _test_eof;
1118
+ _test_eof4: cs = 4; goto _test_eof;
1119
+ _test_eof6: cs = 6; goto _test_eof;
1120
+ _test_eof7: cs = 7; goto _test_eof;
1121
+ _test_eof8: cs = 8; goto _test_eof;
1122
+ _test_eof5: cs = 5; goto _test_eof;
1123
+
1124
+ _test_eof: {}
1125
+ _out: {}
1126
+ }
1127
+
1128
+ #line 416 "edn_parser.rl"
1129
+
1130
+ if (cs >= EDN_ratio_first_final) {
1131
+ v = edn::util::ratio_to_ruby(p_save, p - p_save);
1132
+ return p + 1;
1133
+ }
1134
+ else if (cs == EDN_ratio_en_main) {} // silence ragel warning
1135
+ return nullptr;
1136
+ }
998
1137
 
999
1138
  // ============================================================
1000
1139
  // operator parsing - handles tokens w/ a leading operator:
@@ -1004,7 +1143,7 @@ case 6:
1004
1143
  // 3. stand-alone operators: +, -, /, *, etc.
1005
1144
  //
1006
1145
 
1007
- #line 1008 "edn_parser.cc"
1146
+ #line 1147 "edn_parser.cc"
1008
1147
  static const int EDN_operator_start = 1;
1009
1148
  static const int EDN_operator_first_final = 3;
1010
1149
  static const int EDN_operator_error = 0;
@@ -1012,24 +1151,24 @@ static const int EDN_operator_error = 0;
1012
1151
  static const int EDN_operator_en_main = 1;
1013
1152
 
1014
1153
 
1015
- #line 453 "edn_parser.rl"
1154
+ #line 493 "edn_parser.rl"
1016
1155
 
1017
1156
 
1018
1157
 
1019
1158
  const char* edn::Parser::parse_operator(const char *p, const char *pe, VALUE& v)
1020
1159
  {
1021
- int cs;
1160
+ int cs;
1022
1161
 
1023
1162
 
1024
- #line 1025 "edn_parser.cc"
1163
+ #line 1164 "edn_parser.cc"
1025
1164
  {
1026
1165
  cs = EDN_operator_start;
1027
1166
  }
1028
1167
 
1029
- #line 461 "edn_parser.rl"
1030
- const char* p_save = p;
1168
+ #line 501 "edn_parser.rl"
1169
+ const char* p_save = p;
1031
1170
 
1032
- #line 1033 "edn_parser.cc"
1171
+ #line 1172 "edn_parser.cc"
1033
1172
  {
1034
1173
  if ( p == pe )
1035
1174
  goto _test_eof;
@@ -1082,13 +1221,13 @@ case 3:
1082
1221
  goto tr9;
1083
1222
  goto tr6;
1084
1223
  tr6:
1085
- #line 437 "edn_parser.rl"
1224
+ #line 477 "edn_parser.rl"
1086
1225
  {
1087
- // stand-alone operators (-, +, /, ... etc)
1088
- char op[2] = { *p_save, 0 };
1089
- VALUE sym = rb_str_new2(op);
1090
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1091
- }
1226
+ // stand-alone operators (-, +, /, ... etc)
1227
+ char op[2] = { *p_save, 0 };
1228
+ VALUE sym = rb_str_new2(op);
1229
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1230
+ }
1092
1231
  #line 80 "edn_parser.rl"
1093
1232
  { p--; {p++; cs = 4; goto _out;} }
1094
1233
  goto st4;
@@ -1097,17 +1236,17 @@ tr11:
1097
1236
  { p--; {p++; cs = 4; goto _out;} }
1098
1237
  goto st4;
1099
1238
  tr17:
1100
- #line 403 "edn_parser.rl"
1101
- {
1102
- // parse a symbol including the leading operator (-, +, .)
1103
- VALUE sym = Qnil;
1104
- const char *np = parse_symbol(p_save, pe, sym);
1105
- if (np == nullptr) { {p = (( pe))-1;} } else {
1106
- if (sym != Qnil)
1107
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1108
- {p = (( np))-1;}
1109
- }
1110
- }
1239
+ #line 438 "edn_parser.rl"
1240
+ {
1241
+ // parse a symbol including the leading operator (-, +, .)
1242
+ VALUE sym = Qnil;
1243
+ const char *np = parse_symbol(p_save, pe, sym);
1244
+ if (np == nullptr) { {p = (( pe))-1;} } else {
1245
+ if (sym != Qnil)
1246
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1247
+ {p = (( np))-1;}
1248
+ }
1249
+ }
1111
1250
  #line 80 "edn_parser.rl"
1112
1251
  { p--; {p++; cs = 4; goto _out;} }
1113
1252
  goto st4;
@@ -1115,31 +1254,31 @@ st4:
1115
1254
  if ( ++p == pe )
1116
1255
  goto _test_eof4;
1117
1256
  case 4:
1118
- #line 1119 "edn_parser.cc"
1257
+ #line 1258 "edn_parser.cc"
1119
1258
  goto st0;
1120
1259
  tr5:
1121
1260
  #line 47 "edn_parser.rl"
1122
1261
  { line_number++; }
1123
1262
  goto st5;
1124
1263
  tr7:
1125
- #line 437 "edn_parser.rl"
1264
+ #line 477 "edn_parser.rl"
1126
1265
  {
1127
- // stand-alone operators (-, +, /, ... etc)
1128
- char op[2] = { *p_save, 0 };
1129
- VALUE sym = rb_str_new2(op);
1130
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1131
- }
1266
+ // stand-alone operators (-, +, /, ... etc)
1267
+ char op[2] = { *p_save, 0 };
1268
+ VALUE sym = rb_str_new2(op);
1269
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1270
+ }
1132
1271
  #line 80 "edn_parser.rl"
1133
1272
  { p--; {p++; cs = 5; goto _out;} }
1134
1273
  goto st5;
1135
1274
  tr8:
1136
- #line 437 "edn_parser.rl"
1275
+ #line 477 "edn_parser.rl"
1137
1276
  {
1138
- // stand-alone operators (-, +, /, ... etc)
1139
- char op[2] = { *p_save, 0 };
1140
- VALUE sym = rb_str_new2(op);
1141
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1142
- }
1277
+ // stand-alone operators (-, +, /, ... etc)
1278
+ char op[2] = { *p_save, 0 };
1279
+ VALUE sym = rb_str_new2(op);
1280
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1281
+ }
1143
1282
  #line 47 "edn_parser.rl"
1144
1283
  { line_number++; }
1145
1284
  #line 80 "edn_parser.rl"
@@ -1159,7 +1298,7 @@ st5:
1159
1298
  if ( ++p == pe )
1160
1299
  goto _test_eof5;
1161
1300
  case 5:
1162
- #line 1163 "edn_parser.cc"
1301
+ #line 1302 "edn_parser.cc"
1163
1302
  switch( (*p) ) {
1164
1303
  case 10: goto tr13;
1165
1304
  case 32: goto tr12;
@@ -1184,13 +1323,13 @@ case 5:
1184
1323
  goto st0;
1185
1324
  goto tr11;
1186
1325
  tr10:
1187
- #line 437 "edn_parser.rl"
1326
+ #line 477 "edn_parser.rl"
1188
1327
  {
1189
- // stand-alone operators (-, +, /, ... etc)
1190
- char op[2] = { *p_save, 0 };
1191
- VALUE sym = rb_str_new2(op);
1192
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1193
- }
1328
+ // stand-alone operators (-, +, /, ... etc)
1329
+ char op[2] = { *p_save, 0 };
1330
+ VALUE sym = rb_str_new2(op);
1331
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1332
+ }
1194
1333
  #line 80 "edn_parser.rl"
1195
1334
  { p--; {p++; cs = 6; goto _out;} }
1196
1335
  goto st6;
@@ -1202,7 +1341,7 @@ st6:
1202
1341
  if ( ++p == pe )
1203
1342
  goto _test_eof6;
1204
1343
  case 6:
1205
- #line 1206 "edn_parser.cc"
1344
+ #line 1345 "edn_parser.cc"
1206
1345
  if ( (*p) == 10 )
1207
1346
  goto tr5;
1208
1347
  goto st2;
@@ -1214,48 +1353,53 @@ case 2:
1214
1353
  goto tr5;
1215
1354
  goto st2;
1216
1355
  tr9:
1217
- #line 403 "edn_parser.rl"
1218
- {
1219
- // parse a symbol including the leading operator (-, +, .)
1220
- VALUE sym = Qnil;
1221
- const char *np = parse_symbol(p_save, pe, sym);
1222
- if (np == nullptr) { {p = (( pe))-1;} } else {
1223
- if (sym != Qnil)
1224
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1225
- {p = (( np))-1;}
1226
- }
1227
- }
1356
+ #line 438 "edn_parser.rl"
1357
+ {
1358
+ // parse a symbol including the leading operator (-, +, .)
1359
+ VALUE sym = Qnil;
1360
+ const char *np = parse_symbol(p_save, pe, sym);
1361
+ if (np == nullptr) { {p = (( pe))-1;} } else {
1362
+ if (sym != Qnil)
1363
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1364
+ {p = (( np))-1;}
1365
+ }
1366
+ }
1228
1367
  goto st7;
1229
1368
  tr16:
1230
- #line 414 "edn_parser.rl"
1231
- {
1232
- // parse a number with the leading symbol - this is slightly
1233
- // different than the one within EDN_value since it includes
1234
- // the leading - or +
1235
- //
1236
- // try to parse a decimal first
1237
- const char *np = parse_decimal(p_save, pe, v);
1238
- if (np == nullptr) {
1239
- // if we can't, try to parse it as an int
1369
+ #line 449 "edn_parser.rl"
1370
+ {
1371
+ // parse a number with the leading symbol - this is slightly
1372
+ // different than the one within EDN_value since it includes
1373
+ // the leading - or +
1374
+ //
1375
+ // try to parse a decimal first
1376
+ const char *np = parse_decimal(p_save, pe, v);
1377
+ if (np == nullptr) {
1378
+ // if we can't, try to parse it as a ratio
1379
+ np = parse_ratio(p_save, pe, v);
1380
+
1381
+ if (np == nullptr) {
1382
+ // again, if we can't, try to parse it as an int
1240
1383
  np = parse_integer(p_save, pe, v);
1241
- }
1242
-
1243
- if (np) {
1244
- {p = (( np))-1;}
1245
- p--;
1246
- {p++; cs = 7; goto _out;}
1247
- }
1248
- else {
1249
- error(__FUNCTION__, "number format error", *p);
1250
- {p = (( pe))-1;}
1251
- }
1252
- }
1384
+ }
1385
+ }
1386
+
1387
+ if (np) {
1388
+ {p = (( np))-1;}
1389
+ p--;
1390
+ {p++; cs = 7; goto _out;}
1391
+ }
1392
+ else {
1393
+ error(__FUNCTION__, "number format error", *p);
1394
+ {p = (( pe))-1;}
1395
+ }
1396
+ }
1253
1397
  goto st7;
1254
1398
  st7:
1255
1399
  if ( ++p == pe )
1256
1400
  goto _test_eof7;
1257
1401
  case 7:
1258
- #line 1259 "edn_parser.cc"
1402
+ #line 1403 "edn_parser.cc"
1259
1403
  switch( (*p) ) {
1260
1404
  case 33: goto st0;
1261
1405
  case 95: goto st0;
@@ -1338,23 +1482,23 @@ case 9:
1338
1482
  goto tr18;
1339
1483
  goto tr17;
1340
1484
  tr18:
1341
- #line 403 "edn_parser.rl"
1342
- {
1343
- // parse a symbol including the leading operator (-, +, .)
1344
- VALUE sym = Qnil;
1345
- const char *np = parse_symbol(p_save, pe, sym);
1346
- if (np == nullptr) { {p = (( pe))-1;} } else {
1347
- if (sym != Qnil)
1348
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1349
- {p = (( np))-1;}
1350
- }
1351
- }
1485
+ #line 438 "edn_parser.rl"
1486
+ {
1487
+ // parse a symbol including the leading operator (-, +, .)
1488
+ VALUE sym = Qnil;
1489
+ const char *np = parse_symbol(p_save, pe, sym);
1490
+ if (np == nullptr) { {p = (( pe))-1;} } else {
1491
+ if (sym != Qnil)
1492
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1493
+ {p = (( np))-1;}
1494
+ }
1495
+ }
1352
1496
  goto st10;
1353
1497
  st10:
1354
1498
  if ( ++p == pe )
1355
1499
  goto _test_eof10;
1356
1500
  case 10:
1357
- #line 1358 "edn_parser.cc"
1501
+ #line 1502 "edn_parser.cc"
1358
1502
  switch( (*p) ) {
1359
1503
  case 33: goto st10;
1360
1504
  case 95: goto st10;
@@ -1427,47 +1571,47 @@ case 11:
1427
1571
  {
1428
1572
  switch ( cs ) {
1429
1573
  case 9:
1430
- #line 403 "edn_parser.rl"
1431
- {
1432
- // parse a symbol including the leading operator (-, +, .)
1433
- VALUE sym = Qnil;
1434
- const char *np = parse_symbol(p_save, pe, sym);
1435
- if (np == nullptr) { {p = (( pe))-1;} } else {
1436
- if (sym != Qnil)
1437
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1438
- {p = (( np))-1;}
1439
- }
1440
- }
1574
+ #line 438 "edn_parser.rl"
1575
+ {
1576
+ // parse a symbol including the leading operator (-, +, .)
1577
+ VALUE sym = Qnil;
1578
+ const char *np = parse_symbol(p_save, pe, sym);
1579
+ if (np == nullptr) { {p = (( pe))-1;} } else {
1580
+ if (sym != Qnil)
1581
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1582
+ {p = (( np))-1;}
1583
+ }
1584
+ }
1441
1585
  break;
1442
1586
  case 3:
1443
1587
  case 8:
1444
1588
  case 11:
1445
- #line 437 "edn_parser.rl"
1589
+ #line 477 "edn_parser.rl"
1446
1590
  {
1447
- // stand-alone operators (-, +, /, ... etc)
1448
- char op[2] = { *p_save, 0 };
1449
- VALUE sym = rb_str_new2(op);
1450
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1451
- }
1591
+ // stand-alone operators (-, +, /, ... etc)
1592
+ char op[2] = { *p_save, 0 };
1593
+ VALUE sym = rb_str_new2(op);
1594
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
1595
+ }
1452
1596
  break;
1453
- #line 1454 "edn_parser.cc"
1597
+ #line 1598 "edn_parser.cc"
1454
1598
  }
1455
1599
  }
1456
1600
 
1457
1601
  _out: {}
1458
1602
  }
1459
1603
 
1460
- #line 463 "edn_parser.rl"
1604
+ #line 503 "edn_parser.rl"
1461
1605
 
1462
- if (cs >= EDN_operator_first_final) {
1463
- return p;
1464
- }
1465
- else if (cs == EDN_operator_error) {
1466
- error(__FUNCTION__, "symbol syntax error", *p);
1467
- return pe;
1468
- }
1469
- else if (cs == EDN_operator_en_main) {} // silence ragel warning
1470
- return nullptr;
1606
+ if (cs >= EDN_operator_first_final) {
1607
+ return p;
1608
+ }
1609
+ else if (cs == EDN_operator_error) {
1610
+ error(__FUNCTION__, "symbol syntax error", *p);
1611
+ return pe;
1612
+ }
1613
+ else if (cs == EDN_operator_en_main) {} // silence ragel warning
1614
+ return nullptr;
1471
1615
  }
1472
1616
 
1473
1617
 
@@ -1476,7 +1620,7 @@ case 11:
1476
1620
  // escaped char parsing - handles \c, \newline, \formfeed, etc.
1477
1621
  //
1478
1622
 
1479
- #line 1480 "edn_parser.cc"
1623
+ #line 1624 "edn_parser.cc"
1480
1624
  static const int EDN_escaped_char_start = 1;
1481
1625
  static const int EDN_escaped_char_first_final = 26;
1482
1626
  static const int EDN_escaped_char_error = 0;
@@ -1484,24 +1628,24 @@ static const int EDN_escaped_char_error = 0;
1484
1628
  static const int EDN_escaped_char_en_main = 1;
1485
1629
 
1486
1630
 
1487
- #line 493 "edn_parser.rl"
1631
+ #line 533 "edn_parser.rl"
1488
1632
 
1489
1633
 
1490
1634
 
1491
1635
  const char* edn::Parser::parse_esc_char(const char *p, const char *pe, VALUE& v)
1492
1636
  {
1493
- int cs;
1637
+ int cs;
1494
1638
 
1495
1639
 
1496
- #line 1497 "edn_parser.cc"
1640
+ #line 1641 "edn_parser.cc"
1497
1641
  {
1498
1642
  cs = EDN_escaped_char_start;
1499
1643
  }
1500
1644
 
1501
- #line 501 "edn_parser.rl"
1502
- const char* p_save = p;
1645
+ #line 541 "edn_parser.rl"
1646
+ const char* p_save = p;
1503
1647
 
1504
- #line 1505 "edn_parser.cc"
1648
+ #line 1649 "edn_parser.cc"
1505
1649
  {
1506
1650
  if ( p == pe )
1507
1651
  goto _test_eof;
@@ -1559,7 +1703,7 @@ st27:
1559
1703
  if ( ++p == pe )
1560
1704
  goto _test_eof27;
1561
1705
  case 27:
1562
- #line 1563 "edn_parser.cc"
1706
+ #line 1707 "edn_parser.cc"
1563
1707
  switch( (*p) ) {
1564
1708
  case 10: goto tr10;
1565
1709
  case 32: goto tr28;
@@ -1584,7 +1728,7 @@ st28:
1584
1728
  if ( ++p == pe )
1585
1729
  goto _test_eof28;
1586
1730
  case 28:
1587
- #line 1588 "edn_parser.cc"
1731
+ #line 1732 "edn_parser.cc"
1588
1732
  goto st0;
1589
1733
  st29:
1590
1734
  if ( ++p == pe )
@@ -1893,26 +2037,25 @@ case 25:
1893
2037
  _out: {}
1894
2038
  }
1895
2039
 
1896
- #line 503 "edn_parser.rl"
1897
-
1898
- if (cs >= EDN_escaped_char_first_final) {
1899
- // convert the escaped value to a character
1900
- if (!edn::util::parse_escaped_char(p_save + 1, p, v)) {
1901
- return pe;
1902
- }
1903
- return p;
1904
- }
1905
- else if (cs == EDN_escaped_char_error) {
1906
- error(__FUNCTION__, "unexpected value", *p);
1907
- return pe;
1908
- }
1909
- else if (cs == EDN_escaped_char_en_main) {} // silence ragel warning
1910
- return nullptr;
2040
+ #line 543 "edn_parser.rl"
2041
+
2042
+ if (cs >= EDN_escaped_char_first_final) {
2043
+ // convert the escaped value to a character
2044
+ if (!edn::util::parse_escaped_char(p_save + 1, p, v)) {
2045
+ return pe;
2046
+ }
2047
+ return p;
2048
+ }
2049
+ else if (cs == EDN_escaped_char_error) {
2050
+ error(__FUNCTION__, "unexpected value", *p);
2051
+ return pe;
2052
+ }
2053
+ else if (cs == EDN_escaped_char_en_main) {} // silence ragel warning
2054
+ return nullptr;
1911
2055
  }
1912
2056
 
1913
2057
 
1914
2058
 
1915
-
1916
2059
  // ============================================================
1917
2060
  // symbol parsing - handles identifiers that begin with an alpha
1918
2061
  // character and an optional leading operator (name, -today,
@@ -1920,7 +2063,7 @@ case 25:
1920
2063
  //
1921
2064
  //
1922
2065
 
1923
- #line 1924 "edn_parser.cc"
2066
+ #line 2067 "edn_parser.cc"
1924
2067
  static const int EDN_symbol_start = 1;
1925
2068
  static const int EDN_symbol_first_final = 4;
1926
2069
  static const int EDN_symbol_error = 0;
@@ -1928,24 +2071,24 @@ static const int EDN_symbol_error = 0;
1928
2071
  static const int EDN_symbol_en_main = 1;
1929
2072
 
1930
2073
 
1931
- #line 554 "edn_parser.rl"
2074
+ #line 593 "edn_parser.rl"
1932
2075
 
1933
2076
 
1934
2077
 
1935
2078
  const char* edn::Parser::parse_symbol(const char *p, const char *pe, VALUE& s)
1936
2079
  {
1937
- int cs;
2080
+ int cs;
1938
2081
 
1939
2082
 
1940
- #line 1941 "edn_parser.cc"
2083
+ #line 2084 "edn_parser.cc"
1941
2084
  {
1942
2085
  cs = EDN_symbol_start;
1943
2086
  }
1944
2087
 
1945
- #line 562 "edn_parser.rl"
1946
- const char* p_save = p;
2088
+ #line 601 "edn_parser.rl"
2089
+ const char* p_save = p;
1947
2090
 
1948
- #line 1949 "edn_parser.cc"
2091
+ #line 2092 "edn_parser.cc"
1949
2092
  {
1950
2093
  if ( p == pe )
1951
2094
  goto _test_eof;
@@ -2014,7 +2157,7 @@ st5:
2014
2157
  if ( ++p == pe )
2015
2158
  goto _test_eof5;
2016
2159
  case 5:
2017
- #line 2018 "edn_parser.cc"
2160
+ #line 2161 "edn_parser.cc"
2018
2161
  goto st0;
2019
2162
  tr4:
2020
2163
  #line 47 "edn_parser.rl"
@@ -2034,7 +2177,7 @@ st6:
2034
2177
  if ( ++p == pe )
2035
2178
  goto _test_eof6;
2036
2179
  case 6:
2037
- #line 2038 "edn_parser.cc"
2180
+ #line 2181 "edn_parser.cc"
2038
2181
  switch( (*p) ) {
2039
2182
  case 10: goto tr9;
2040
2183
  case 32: goto tr8;
@@ -2066,7 +2209,7 @@ st7:
2066
2209
  if ( ++p == pe )
2067
2210
  goto _test_eof7;
2068
2211
  case 7:
2069
- #line 2070 "edn_parser.cc"
2212
+ #line 2213 "edn_parser.cc"
2070
2213
  if ( (*p) == 10 )
2071
2214
  goto tr4;
2072
2215
  goto st2;
@@ -2174,24 +2317,23 @@ case 9:
2174
2317
  _out: {}
2175
2318
  }
2176
2319
 
2177
- #line 564 "edn_parser.rl"
2178
-
2179
- if (cs >= EDN_symbol_first_final) {
2180
- // copy the symbol text
2181
- if (s == Qnil)
2182
- s = rb_str_new2("");
2183
- rb_str_cat(s, p_save, p - p_save);
2184
- return p;
2185
- }
2186
- else if (cs == EDN_symbol_error) {
2187
- error(__FUNCTION__, "invalid symbol sequence", *p);
2188
- }
2189
- else if (cs == EDN_symbol_en_main) {} // silence ragel warning
2190
- return nullptr;
2320
+ #line 603 "edn_parser.rl"
2321
+
2322
+ if (cs >= EDN_symbol_first_final) {
2323
+ // copy the symbol text
2324
+ if (s == Qnil)
2325
+ s = rb_str_new2("");
2326
+ rb_str_cat(s, p_save, p - p_save);
2327
+ return p;
2328
+ }
2329
+ else if (cs == EDN_symbol_error) {
2330
+ error(__FUNCTION__, "invalid symbol sequence", *p);
2331
+ }
2332
+ else if (cs == EDN_symbol_en_main) {} // silence ragel warning
2333
+ return nullptr;
2191
2334
  }
2192
2335
 
2193
2336
 
2194
-
2195
2337
  // ============================================================
2196
2338
  // EDN_sequence_common is used to parse EDN containers - elements are
2197
2339
  // initially stored in an array and then the final corresponding
@@ -2199,13 +2341,13 @@ case 9:
2199
2341
  // sets the same array is used)
2200
2342
  //
2201
2343
 
2202
- #line 642 "edn_parser.rl"
2344
+ #line 680 "edn_parser.rl"
2203
2345
 
2204
2346
 
2205
2347
  //
2206
2348
  // vector-specific machine
2207
2349
 
2208
- #line 2209 "edn_parser.cc"
2350
+ #line 2351 "edn_parser.cc"
2209
2351
  static const int EDN_vector_start = 1;
2210
2352
  static const int EDN_vector_first_final = 4;
2211
2353
  static const int EDN_vector_error = 0;
@@ -2213,7 +2355,7 @@ static const int EDN_vector_error = 0;
2213
2355
  static const int EDN_vector_en_main = 1;
2214
2356
 
2215
2357
 
2216
- #line 657 "edn_parser.rl"
2358
+ #line 695 "edn_parser.rl"
2217
2359
 
2218
2360
 
2219
2361
 
@@ -2222,20 +2364,20 @@ static const int EDN_vector_en_main = 1;
2222
2364
  //
2223
2365
  const char* edn::Parser::parse_vector(const char *p, const char *pe, VALUE& v)
2224
2366
  {
2225
- static const char* EDN_TYPE = "vector";
2367
+ static const char* EDN_TYPE = "vector";
2226
2368
 
2227
- int cs;
2228
- VALUE elems; // will store the vector's elements - allocated in @open_seq
2369
+ int cs;
2370
+ VALUE elems; // will store the vector's elements - allocated in @open_seq
2229
2371
 
2230
2372
 
2231
- #line 2232 "edn_parser.cc"
2373
+ #line 2374 "edn_parser.cc"
2232
2374
  {
2233
2375
  cs = EDN_vector_start;
2234
2376
  }
2235
2377
 
2236
- #line 671 "edn_parser.rl"
2378
+ #line 709 "edn_parser.rl"
2237
2379
 
2238
- #line 2239 "edn_parser.cc"
2380
+ #line 2381 "edn_parser.cc"
2239
2381
  {
2240
2382
  if ( p == pe )
2241
2383
  goto _test_eof;
@@ -2248,72 +2390,72 @@ case 1:
2248
2390
  tr2:
2249
2391
  #line 73 "edn_parser.rl"
2250
2392
  {
2251
- std::stringstream s;
2252
- s << "unterminated " << EDN_TYPE;
2253
- error(__FUNCTION__, s.str());
2254
- p--; {p++; cs = 0; goto _out;}
2255
- }
2393
+ std::stringstream s;
2394
+ s << "unterminated " << EDN_TYPE;
2395
+ error(__FUNCTION__, s.str());
2396
+ p--; {p++; cs = 0; goto _out;}
2397
+ }
2256
2398
  goto st0;
2257
- #line 2258 "edn_parser.cc"
2399
+ #line 2400 "edn_parser.cc"
2258
2400
  st0:
2259
2401
  cs = 0;
2260
2402
  goto _out;
2261
2403
  tr0:
2262
- #line 591 "edn_parser.rl"
2263
- {
2264
- // sequences store elements in an array, then process it to
2265
- // convert it to a list, set, or map as needed once the
2266
- // sequence end is reached
2267
- elems = rb_ary_new();
2268
- // additionally, metadata for elements in the sequence may be
2269
- // carried so we must push a new level in the metadata stack
2270
- new_meta_list();
2271
- }
2404
+ #line 629 "edn_parser.rl"
2405
+ {
2406
+ // sequences store elements in an array, then process it to
2407
+ // convert it to a list, set, or map as needed once the
2408
+ // sequence end is reached
2409
+ elems = rb_ary_new();
2410
+ // additionally, metadata for elements in the sequence may be
2411
+ // carried so we must push a new level in the metadata stack
2412
+ new_meta_list();
2413
+ }
2272
2414
  goto st2;
2273
2415
  tr4:
2274
2416
  #line 47 "edn_parser.rl"
2275
2417
  { line_number++; }
2276
2418
  goto st2;
2277
2419
  tr5:
2278
- #line 606 "edn_parser.rl"
2279
- {
2280
- // reads an item within a sequence (vector, list, map, or
2281
- // set). Regardless of the sequence type, an array of the
2282
- // items is built. Once done, the sequence parser will convert
2283
- // if needed
2284
- VALUE e;
2285
- std::size_t meta_sz = meta_size();
2286
- const char *np = parse_value(p, pe, e);
2287
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
2288
- // if there's an entry in the discard list, the current
2289
- // object is not meant to be kept due to a #_ so don't
2290
- // push it into the list of elements
2291
- if (!discard.empty()) {
2292
- discard.pop_back();
2420
+ #line 644 "edn_parser.rl"
2421
+ {
2422
+ // reads an item within a sequence (vector, list, map, or
2423
+ // set). Regardless of the sequence type, an array of the
2424
+ // items is built. Once done, the sequence parser will convert
2425
+ // if needed
2426
+ VALUE e;
2427
+ std::size_t meta_sz = meta_size();
2428
+ const char *np = parse_value(p, pe, e);
2429
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
2430
+ // if there's an entry in the discard list, the current
2431
+ // object is not meant to be kept due to a #_ so don't
2432
+ // push it into the list of elements
2433
+ if (!discard.empty()) {
2434
+ discard.pop_back();
2435
+ }
2436
+ else if (!meta_empty()) {
2437
+ // check if parse_value added metadata
2438
+ if (meta_size() == meta_sz) {
2439
+ // there's metadata and it didn't increase so
2440
+ // parse_value() read an element we care
2441
+ // about. Bind the metadata to it and add it to
2442
+ // the sequence
2443
+ e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2444
+ rb_ary_push(elems, e);
2293
2445
  }
2294
- else if (!meta_empty()) {
2295
- // check if parse_value added metadata
2296
- if (meta_size() == meta_sz) {
2297
- // there's metadata and it didn't increase so
2298
- // parse_value() read an element we care
2299
- // about. Bind the metadata to it and add it to
2300
- // the sequence
2301
- e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2302
- rb_ary_push(elems, e);
2303
- }
2304
- } else {
2305
- // no metadata.. just push it
2306
- rb_ary_push(elems, e);
2307
- }
2308
- {p = (( np))-1;}
2309
- }
2310
- }
2446
+ } else {
2447
+ // no metadata.. just push it
2448
+ rb_ary_push(elems, e);
2449
+ }
2450
+ {p = (( np))-1;}
2451
+ }
2452
+ }
2311
2453
  goto st2;
2312
2454
  st2:
2313
2455
  if ( ++p == pe )
2314
2456
  goto _test_eof2;
2315
2457
  case 2:
2316
- #line 2317 "edn_parser.cc"
2458
+ #line 2459 "edn_parser.cc"
2317
2459
  switch( (*p) ) {
2318
2460
  case 10: goto tr4;
2319
2461
  case 32: goto st2;
@@ -2344,11 +2486,11 @@ case 3:
2344
2486
  goto tr4;
2345
2487
  goto st3;
2346
2488
  tr7:
2347
- #line 601 "edn_parser.rl"
2489
+ #line 639 "edn_parser.rl"
2348
2490
  {
2349
- // remove the current metadata level
2350
- del_top_meta_list();
2351
- }
2491
+ // remove the current metadata level
2492
+ del_top_meta_list();
2493
+ }
2352
2494
  #line 80 "edn_parser.rl"
2353
2495
  { p--; {p++; cs = 4; goto _out;} }
2354
2496
  goto st4;
@@ -2356,7 +2498,7 @@ st4:
2356
2498
  if ( ++p == pe )
2357
2499
  goto _test_eof4;
2358
2500
  case 4:
2359
- #line 2360 "edn_parser.cc"
2501
+ #line 2502 "edn_parser.cc"
2360
2502
  goto st0;
2361
2503
  }
2362
2504
  _test_eof2: cs = 2; goto _test_eof;
@@ -2371,31 +2513,31 @@ case 4:
2371
2513
  case 3:
2372
2514
  #line 73 "edn_parser.rl"
2373
2515
  {
2374
- std::stringstream s;
2375
- s << "unterminated " << EDN_TYPE;
2376
- error(__FUNCTION__, s.str());
2377
- p--; {p++; cs = 0; goto _out;}
2378
- }
2516
+ std::stringstream s;
2517
+ s << "unterminated " << EDN_TYPE;
2518
+ error(__FUNCTION__, s.str());
2519
+ p--; {p++; cs = 0; goto _out;}
2520
+ }
2379
2521
  break;
2380
- #line 2381 "edn_parser.cc"
2522
+ #line 2523 "edn_parser.cc"
2381
2523
  }
2382
2524
  }
2383
2525
 
2384
2526
  _out: {}
2385
2527
  }
2386
2528
 
2387
- #line 672 "edn_parser.rl"
2529
+ #line 710 "edn_parser.rl"
2388
2530
 
2389
- if (cs >= EDN_vector_first_final) {
2390
- v = elems;
2391
- return p + 1;
2392
- }
2393
- else if (cs == EDN_vector_error) {
2394
- error(__FUNCTION__, "vector format error", *p);
2395
- return pe;
2396
- }
2397
- else if (cs == EDN_vector_en_main) {} // silence ragel warning
2398
- return nullptr;
2531
+ if (cs >= EDN_vector_first_final) {
2532
+ v = elems;
2533
+ return p + 1;
2534
+ }
2535
+ else if (cs == EDN_vector_error) {
2536
+ error(__FUNCTION__, "vector format error", *p);
2537
+ return pe;
2538
+ }
2539
+ else if (cs == EDN_vector_en_main) {} // silence ragel warning
2540
+ return nullptr;
2399
2541
  }
2400
2542
 
2401
2543
 
@@ -2404,7 +2546,7 @@ case 4:
2404
2546
  // list parsing machine
2405
2547
  //
2406
2548
 
2407
- #line 2408 "edn_parser.cc"
2549
+ #line 2550 "edn_parser.cc"
2408
2550
  static const int EDN_list_start = 1;
2409
2551
  static const int EDN_list_first_final = 4;
2410
2552
  static const int EDN_list_error = 0;
@@ -2412,7 +2554,7 @@ static const int EDN_list_error = 0;
2412
2554
  static const int EDN_list_en_main = 1;
2413
2555
 
2414
2556
 
2415
- #line 701 "edn_parser.rl"
2557
+ #line 739 "edn_parser.rl"
2416
2558
 
2417
2559
 
2418
2560
  //
@@ -2420,20 +2562,20 @@ static const int EDN_list_en_main = 1;
2420
2562
  //
2421
2563
  const char* edn::Parser::parse_list(const char *p, const char *pe, VALUE& v)
2422
2564
  {
2423
- static const char* EDN_TYPE = "list";
2565
+ static const char* EDN_TYPE = "list";
2424
2566
 
2425
- int cs;
2426
- VALUE elems; // stores the list's elements - allocated in @open_seq
2567
+ int cs;
2568
+ VALUE elems; // stores the list's elements - allocated in @open_seq
2427
2569
 
2428
2570
 
2429
- #line 2430 "edn_parser.cc"
2571
+ #line 2572 "edn_parser.cc"
2430
2572
  {
2431
2573
  cs = EDN_list_start;
2432
2574
  }
2433
2575
 
2434
- #line 714 "edn_parser.rl"
2576
+ #line 752 "edn_parser.rl"
2435
2577
 
2436
- #line 2437 "edn_parser.cc"
2578
+ #line 2579 "edn_parser.cc"
2437
2579
  {
2438
2580
  if ( p == pe )
2439
2581
  goto _test_eof;
@@ -2446,72 +2588,72 @@ case 1:
2446
2588
  tr2:
2447
2589
  #line 73 "edn_parser.rl"
2448
2590
  {
2449
- std::stringstream s;
2450
- s << "unterminated " << EDN_TYPE;
2451
- error(__FUNCTION__, s.str());
2452
- p--; {p++; cs = 0; goto _out;}
2453
- }
2591
+ std::stringstream s;
2592
+ s << "unterminated " << EDN_TYPE;
2593
+ error(__FUNCTION__, s.str());
2594
+ p--; {p++; cs = 0; goto _out;}
2595
+ }
2454
2596
  goto st0;
2455
- #line 2456 "edn_parser.cc"
2597
+ #line 2598 "edn_parser.cc"
2456
2598
  st0:
2457
2599
  cs = 0;
2458
2600
  goto _out;
2459
2601
  tr0:
2460
- #line 591 "edn_parser.rl"
2461
- {
2462
- // sequences store elements in an array, then process it to
2463
- // convert it to a list, set, or map as needed once the
2464
- // sequence end is reached
2465
- elems = rb_ary_new();
2466
- // additionally, metadata for elements in the sequence may be
2467
- // carried so we must push a new level in the metadata stack
2468
- new_meta_list();
2469
- }
2602
+ #line 629 "edn_parser.rl"
2603
+ {
2604
+ // sequences store elements in an array, then process it to
2605
+ // convert it to a list, set, or map as needed once the
2606
+ // sequence end is reached
2607
+ elems = rb_ary_new();
2608
+ // additionally, metadata for elements in the sequence may be
2609
+ // carried so we must push a new level in the metadata stack
2610
+ new_meta_list();
2611
+ }
2470
2612
  goto st2;
2471
2613
  tr4:
2472
2614
  #line 47 "edn_parser.rl"
2473
2615
  { line_number++; }
2474
2616
  goto st2;
2475
2617
  tr5:
2476
- #line 606 "edn_parser.rl"
2477
- {
2478
- // reads an item within a sequence (vector, list, map, or
2479
- // set). Regardless of the sequence type, an array of the
2480
- // items is built. Once done, the sequence parser will convert
2481
- // if needed
2482
- VALUE e;
2483
- std::size_t meta_sz = meta_size();
2484
- const char *np = parse_value(p, pe, e);
2485
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
2486
- // if there's an entry in the discard list, the current
2487
- // object is not meant to be kept due to a #_ so don't
2488
- // push it into the list of elements
2489
- if (!discard.empty()) {
2490
- discard.pop_back();
2491
- }
2492
- else if (!meta_empty()) {
2493
- // check if parse_value added metadata
2494
- if (meta_size() == meta_sz) {
2495
- // there's metadata and it didn't increase so
2496
- // parse_value() read an element we care
2497
- // about. Bind the metadata to it and add it to
2498
- // the sequence
2499
- e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2500
- rb_ary_push(elems, e);
2501
- }
2502
- } else {
2503
- // no metadata.. just push it
2504
- rb_ary_push(elems, e);
2618
+ #line 644 "edn_parser.rl"
2619
+ {
2620
+ // reads an item within a sequence (vector, list, map, or
2621
+ // set). Regardless of the sequence type, an array of the
2622
+ // items is built. Once done, the sequence parser will convert
2623
+ // if needed
2624
+ VALUE e;
2625
+ std::size_t meta_sz = meta_size();
2626
+ const char *np = parse_value(p, pe, e);
2627
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
2628
+ // if there's an entry in the discard list, the current
2629
+ // object is not meant to be kept due to a #_ so don't
2630
+ // push it into the list of elements
2631
+ if (!discard.empty()) {
2632
+ discard.pop_back();
2633
+ }
2634
+ else if (!meta_empty()) {
2635
+ // check if parse_value added metadata
2636
+ if (meta_size() == meta_sz) {
2637
+ // there's metadata and it didn't increase so
2638
+ // parse_value() read an element we care
2639
+ // about. Bind the metadata to it and add it to
2640
+ // the sequence
2641
+ e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2642
+ rb_ary_push(elems, e);
2505
2643
  }
2506
- {p = (( np))-1;}
2507
- }
2508
- }
2644
+ } else {
2645
+ // no metadata.. just push it
2646
+ rb_ary_push(elems, e);
2647
+ }
2648
+ {p = (( np))-1;}
2649
+ }
2650
+ }
2509
2651
  goto st2;
2510
2652
  st2:
2511
2653
  if ( ++p == pe )
2512
2654
  goto _test_eof2;
2513
2655
  case 2:
2514
- #line 2515 "edn_parser.cc"
2656
+ #line 2657 "edn_parser.cc"
2515
2657
  switch( (*p) ) {
2516
2658
  case 10: goto tr4;
2517
2659
  case 32: goto st2;
@@ -2535,11 +2677,11 @@ case 2:
2535
2677
  goto tr5;
2536
2678
  goto tr2;
2537
2679
  tr6:
2538
- #line 601 "edn_parser.rl"
2680
+ #line 639 "edn_parser.rl"
2539
2681
  {
2540
- // remove the current metadata level
2541
- del_top_meta_list();
2542
- }
2682
+ // remove the current metadata level
2683
+ del_top_meta_list();
2684
+ }
2543
2685
  #line 80 "edn_parser.rl"
2544
2686
  { p--; {p++; cs = 4; goto _out;} }
2545
2687
  goto st4;
@@ -2547,7 +2689,7 @@ st4:
2547
2689
  if ( ++p == pe )
2548
2690
  goto _test_eof4;
2549
2691
  case 4:
2550
- #line 2551 "edn_parser.cc"
2692
+ #line 2693 "edn_parser.cc"
2551
2693
  goto st0;
2552
2694
  st3:
2553
2695
  if ( ++p == pe )
@@ -2569,33 +2711,33 @@ case 3:
2569
2711
  case 3:
2570
2712
  #line 73 "edn_parser.rl"
2571
2713
  {
2572
- std::stringstream s;
2573
- s << "unterminated " << EDN_TYPE;
2574
- error(__FUNCTION__, s.str());
2575
- p--; {p++; cs = 0; goto _out;}
2576
- }
2714
+ std::stringstream s;
2715
+ s << "unterminated " << EDN_TYPE;
2716
+ error(__FUNCTION__, s.str());
2717
+ p--; {p++; cs = 0; goto _out;}
2718
+ }
2577
2719
  break;
2578
- #line 2579 "edn_parser.cc"
2720
+ #line 2721 "edn_parser.cc"
2579
2721
  }
2580
2722
  }
2581
2723
 
2582
2724
  _out: {}
2583
2725
  }
2584
2726
 
2585
- #line 715 "edn_parser.rl"
2586
-
2587
- if (cs >= EDN_list_first_final) {
2588
- v = elems;
2589
- // TODO: replace with this but first figure out why array is not unrolled by EDN::list()
2590
- // v = edn::util::call_module_fn(EDN_MAKE_LIST_METHOD, elems);
2591
- return p + 1;
2592
- }
2593
- else if (cs == EDN_list_error) {
2594
- error(__FUNCTION__, *p);
2595
- return pe;
2596
- }
2597
- else if (cs == EDN_list_en_main) {} // silence ragel warning
2598
- return nullptr;
2727
+ #line 753 "edn_parser.rl"
2728
+
2729
+ if (cs >= EDN_list_first_final) {
2730
+ //v = elems;
2731
+ // TODO: replace with this but first figure out why array is not unrolled by EDN::list()
2732
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_LIST_METHOD, elems);
2733
+ return p + 1;
2734
+ }
2735
+ else if (cs == EDN_list_error) {
2736
+ error(__FUNCTION__, *p);
2737
+ return pe;
2738
+ }
2739
+ else if (cs == EDN_list_en_main) {} // silence ragel warning
2740
+ return nullptr;
2599
2741
  }
2600
2742
 
2601
2743
 
@@ -2604,7 +2746,7 @@ case 3:
2604
2746
  // hash parsing
2605
2747
  //
2606
2748
 
2607
- #line 2608 "edn_parser.cc"
2749
+ #line 2750 "edn_parser.cc"
2608
2750
  static const int EDN_map_start = 1;
2609
2751
  static const int EDN_map_first_final = 4;
2610
2752
  static const int EDN_map_error = 0;
@@ -2612,28 +2754,28 @@ static const int EDN_map_error = 0;
2612
2754
  static const int EDN_map_en_main = 1;
2613
2755
 
2614
2756
 
2615
- #line 747 "edn_parser.rl"
2757
+ #line 785 "edn_parser.rl"
2616
2758
 
2617
2759
 
2618
2760
 
2619
2761
  const char* edn::Parser::parse_map(const char *p, const char *pe, VALUE& v)
2620
2762
  {
2621
- static const char* EDN_TYPE = "map";
2763
+ static const char* EDN_TYPE = "map";
2622
2764
 
2623
- int cs;
2624
- // since we don't know whether we're looking at a key or value,
2625
- // initially store all elements in an array (allocated in @open_seq)
2626
- VALUE elems;
2765
+ int cs;
2766
+ // since we don't know whether we're looking at a key or value,
2767
+ // initially store all elements in an array (allocated in @open_seq)
2768
+ VALUE elems;
2627
2769
 
2628
2770
 
2629
- #line 2630 "edn_parser.cc"
2771
+ #line 2772 "edn_parser.cc"
2630
2772
  {
2631
2773
  cs = EDN_map_start;
2632
2774
  }
2633
2775
 
2634
- #line 760 "edn_parser.rl"
2776
+ #line 798 "edn_parser.rl"
2635
2777
 
2636
- #line 2637 "edn_parser.cc"
2778
+ #line 2779 "edn_parser.cc"
2637
2779
  {
2638
2780
  if ( p == pe )
2639
2781
  goto _test_eof;
@@ -2646,72 +2788,72 @@ case 1:
2646
2788
  tr2:
2647
2789
  #line 73 "edn_parser.rl"
2648
2790
  {
2649
- std::stringstream s;
2650
- s << "unterminated " << EDN_TYPE;
2651
- error(__FUNCTION__, s.str());
2652
- p--; {p++; cs = 0; goto _out;}
2653
- }
2791
+ std::stringstream s;
2792
+ s << "unterminated " << EDN_TYPE;
2793
+ error(__FUNCTION__, s.str());
2794
+ p--; {p++; cs = 0; goto _out;}
2795
+ }
2654
2796
  goto st0;
2655
- #line 2656 "edn_parser.cc"
2797
+ #line 2798 "edn_parser.cc"
2656
2798
  st0:
2657
2799
  cs = 0;
2658
2800
  goto _out;
2659
2801
  tr0:
2660
- #line 591 "edn_parser.rl"
2661
- {
2662
- // sequences store elements in an array, then process it to
2663
- // convert it to a list, set, or map as needed once the
2664
- // sequence end is reached
2665
- elems = rb_ary_new();
2666
- // additionally, metadata for elements in the sequence may be
2667
- // carried so we must push a new level in the metadata stack
2668
- new_meta_list();
2669
- }
2802
+ #line 629 "edn_parser.rl"
2803
+ {
2804
+ // sequences store elements in an array, then process it to
2805
+ // convert it to a list, set, or map as needed once the
2806
+ // sequence end is reached
2807
+ elems = rb_ary_new();
2808
+ // additionally, metadata for elements in the sequence may be
2809
+ // carried so we must push a new level in the metadata stack
2810
+ new_meta_list();
2811
+ }
2670
2812
  goto st2;
2671
2813
  tr4:
2672
2814
  #line 47 "edn_parser.rl"
2673
2815
  { line_number++; }
2674
2816
  goto st2;
2675
2817
  tr5:
2676
- #line 606 "edn_parser.rl"
2677
- {
2678
- // reads an item within a sequence (vector, list, map, or
2679
- // set). Regardless of the sequence type, an array of the
2680
- // items is built. Once done, the sequence parser will convert
2681
- // if needed
2682
- VALUE e;
2683
- std::size_t meta_sz = meta_size();
2684
- const char *np = parse_value(p, pe, e);
2685
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
2686
- // if there's an entry in the discard list, the current
2687
- // object is not meant to be kept due to a #_ so don't
2688
- // push it into the list of elements
2689
- if (!discard.empty()) {
2690
- discard.pop_back();
2818
+ #line 644 "edn_parser.rl"
2819
+ {
2820
+ // reads an item within a sequence (vector, list, map, or
2821
+ // set). Regardless of the sequence type, an array of the
2822
+ // items is built. Once done, the sequence parser will convert
2823
+ // if needed
2824
+ VALUE e;
2825
+ std::size_t meta_sz = meta_size();
2826
+ const char *np = parse_value(p, pe, e);
2827
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
2828
+ // if there's an entry in the discard list, the current
2829
+ // object is not meant to be kept due to a #_ so don't
2830
+ // push it into the list of elements
2831
+ if (!discard.empty()) {
2832
+ discard.pop_back();
2833
+ }
2834
+ else if (!meta_empty()) {
2835
+ // check if parse_value added metadata
2836
+ if (meta_size() == meta_sz) {
2837
+ // there's metadata and it didn't increase so
2838
+ // parse_value() read an element we care
2839
+ // about. Bind the metadata to it and add it to
2840
+ // the sequence
2841
+ e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2842
+ rb_ary_push(elems, e);
2691
2843
  }
2692
- else if (!meta_empty()) {
2693
- // check if parse_value added metadata
2694
- if (meta_size() == meta_sz) {
2695
- // there's metadata and it didn't increase so
2696
- // parse_value() read an element we care
2697
- // about. Bind the metadata to it and add it to
2698
- // the sequence
2699
- e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2700
- rb_ary_push(elems, e);
2701
- }
2702
- } else {
2703
- // no metadata.. just push it
2704
- rb_ary_push(elems, e);
2705
- }
2706
- {p = (( np))-1;}
2707
- }
2708
- }
2844
+ } else {
2845
+ // no metadata.. just push it
2846
+ rb_ary_push(elems, e);
2847
+ }
2848
+ {p = (( np))-1;}
2849
+ }
2850
+ }
2709
2851
  goto st2;
2710
2852
  st2:
2711
2853
  if ( ++p == pe )
2712
2854
  goto _test_eof2;
2713
2855
  case 2:
2714
- #line 2715 "edn_parser.cc"
2856
+ #line 2857 "edn_parser.cc"
2715
2857
  switch( (*p) ) {
2716
2858
  case 10: goto tr4;
2717
2859
  case 32: goto st2;
@@ -2745,11 +2887,11 @@ case 3:
2745
2887
  goto tr4;
2746
2888
  goto st3;
2747
2889
  tr7:
2748
- #line 601 "edn_parser.rl"
2890
+ #line 639 "edn_parser.rl"
2749
2891
  {
2750
- // remove the current metadata level
2751
- del_top_meta_list();
2752
- }
2892
+ // remove the current metadata level
2893
+ del_top_meta_list();
2894
+ }
2753
2895
  #line 80 "edn_parser.rl"
2754
2896
  { p--; {p++; cs = 4; goto _out;} }
2755
2897
  goto st4;
@@ -2757,7 +2899,7 @@ st4:
2757
2899
  if ( ++p == pe )
2758
2900
  goto _test_eof4;
2759
2901
  case 4:
2760
- #line 2761 "edn_parser.cc"
2902
+ #line 2903 "edn_parser.cc"
2761
2903
  goto st0;
2762
2904
  }
2763
2905
  _test_eof2: cs = 2; goto _test_eof;
@@ -2772,45 +2914,44 @@ case 4:
2772
2914
  case 3:
2773
2915
  #line 73 "edn_parser.rl"
2774
2916
  {
2775
- std::stringstream s;
2776
- s << "unterminated " << EDN_TYPE;
2777
- error(__FUNCTION__, s.str());
2778
- p--; {p++; cs = 0; goto _out;}
2779
- }
2917
+ std::stringstream s;
2918
+ s << "unterminated " << EDN_TYPE;
2919
+ error(__FUNCTION__, s.str());
2920
+ p--; {p++; cs = 0; goto _out;}
2921
+ }
2780
2922
  break;
2781
- #line 2782 "edn_parser.cc"
2923
+ #line 2924 "edn_parser.cc"
2782
2924
  }
2783
2925
  }
2784
2926
 
2785
2927
  _out: {}
2786
2928
  }
2787
2929
 
2788
- #line 761 "edn_parser.rl"
2789
-
2790
- if (cs >= EDN_map_first_final) {
2791
-
2792
- // hash parsing is done. Make sure we have an even count
2793
- if ((RARRAY_LEN(elems) % 2) != 0) {
2794
- error(__FUNCTION__, "odd number of elements in map");
2795
- return pe;
2796
- }
2797
-
2798
- // now convert the sequence to a hash
2799
- VALUE rslt = rb_hash_new();
2800
- while (RARRAY_LEN(elems) > 0)
2801
- {
2802
- VALUE k = rb_ary_shift(elems);
2803
- rb_hash_aset(rslt, k, rb_ary_shift(elems));
2804
- }
2805
-
2806
- v = rslt;
2807
- return p + 1;
2808
- }
2809
- else if (cs == EDN_map_error) {
2810
- return pe;
2811
- }
2812
- else if (cs == EDN_map_en_main) {} // silence ragel warning
2813
- return nullptr;
2930
+ #line 799 "edn_parser.rl"
2931
+
2932
+ if (cs >= EDN_map_first_final) {
2933
+ // hash parsing is done. Make sure we have an even count
2934
+ if ((RARRAY_LEN(elems) % 2) != 0) {
2935
+ error(__FUNCTION__, "odd number of elements in map");
2936
+ return pe;
2937
+ }
2938
+
2939
+ // now convert the sequence to a hash
2940
+ VALUE rslt = rb_hash_new();
2941
+ while (RARRAY_LEN(elems) > 0)
2942
+ {
2943
+ VALUE k = rb_ary_shift(elems);
2944
+ rb_hash_aset(rslt, k, rb_ary_shift(elems));
2945
+ }
2946
+
2947
+ v = rslt;
2948
+ return p + 1;
2949
+ }
2950
+ else if (cs == EDN_map_error) {
2951
+ return pe;
2952
+ }
2953
+ else if (cs == EDN_map_en_main) {} // silence ragel warning
2954
+ return nullptr;
2814
2955
  }
2815
2956
 
2816
2957
 
@@ -2821,7 +2962,7 @@ case 4:
2821
2962
  // the remaining data to the correct parser
2822
2963
  //
2823
2964
 
2824
- #line 2825 "edn_parser.cc"
2965
+ #line 2966 "edn_parser.cc"
2825
2966
  static const int EDN_dispatch_start = 1;
2826
2967
  static const int EDN_dispatch_first_final = 2;
2827
2968
  static const int EDN_dispatch_error = 0;
@@ -2829,23 +2970,23 @@ static const int EDN_dispatch_error = 0;
2829
2970
  static const int EDN_dispatch_en_main = 1;
2830
2971
 
2831
2972
 
2832
- #line 825 "edn_parser.rl"
2973
+ #line 862 "edn_parser.rl"
2833
2974
 
2834
2975
 
2835
2976
 
2836
2977
  const char* edn::Parser::parse_dispatch(const char *p, const char *pe, VALUE& v)
2837
2978
  {
2838
- int cs;
2979
+ int cs;
2839
2980
 
2840
2981
 
2841
- #line 2842 "edn_parser.cc"
2982
+ #line 2983 "edn_parser.cc"
2842
2983
  {
2843
2984
  cs = EDN_dispatch_start;
2844
2985
  }
2845
2986
 
2846
- #line 833 "edn_parser.rl"
2987
+ #line 870 "edn_parser.rl"
2847
2988
 
2848
- #line 2849 "edn_parser.cc"
2989
+ #line 2990 "edn_parser.cc"
2849
2990
  {
2850
2991
  if ( p == pe )
2851
2992
  goto _test_eof;
@@ -2866,32 +3007,32 @@ st0:
2866
3007
  cs = 0;
2867
3008
  goto _out;
2868
3009
  tr0:
2869
- #line 813 "edn_parser.rl"
3010
+ #line 850 "edn_parser.rl"
2870
3011
  {
2871
- // #inst, #uuid, or #user/tag
2872
- const char *np = parse_tagged(p, pe, v);
2873
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
2874
- }
3012
+ // #inst, #uuid, or #user/tag
3013
+ const char *np = parse_tagged(p, pe, v);
3014
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
3015
+ }
2875
3016
  #line 80 "edn_parser.rl"
2876
3017
  { p--; {p++; cs = 2; goto _out;} }
2877
3018
  goto st2;
2878
3019
  tr2:
2879
- #line 807 "edn_parser.rl"
3020
+ #line 844 "edn_parser.rl"
2880
3021
  {
2881
- // discard token #_
2882
- const char *np = parse_discard(p, pe);
2883
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
2884
- }
3022
+ // discard token #_
3023
+ const char *np = parse_discard(p, pe);
3024
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
3025
+ }
2885
3026
  #line 80 "edn_parser.rl"
2886
3027
  { p--; {p++; cs = 2; goto _out;} }
2887
3028
  goto st2;
2888
3029
  tr3:
2889
- #line 801 "edn_parser.rl"
3030
+ #line 838 "edn_parser.rl"
2890
3031
  {
2891
- // #{ }
2892
- const char *np = parse_set(p, pe, v);
2893
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
2894
- }
3032
+ // #{ }
3033
+ const char *np = parse_set(p, pe, v);
3034
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
3035
+ }
2895
3036
  #line 80 "edn_parser.rl"
2896
3037
  { p--; {p++; cs = 2; goto _out;} }
2897
3038
  goto st2;
@@ -2899,7 +3040,7 @@ st2:
2899
3040
  if ( ++p == pe )
2900
3041
  goto _test_eof2;
2901
3042
  case 2:
2902
- #line 2903 "edn_parser.cc"
3043
+ #line 3044 "edn_parser.cc"
2903
3044
  goto st0;
2904
3045
  }
2905
3046
  _test_eof2: cs = 2; goto _test_eof;
@@ -2908,18 +3049,17 @@ case 2:
2908
3049
  _out: {}
2909
3050
  }
2910
3051
 
2911
- #line 834 "edn_parser.rl"
2912
-
2913
- if (cs >= EDN_dispatch_first_final) {
2914
- return p + 1;
2915
- }
2916
- else if (cs == EDN_dispatch_error) {
2917
- error(__FUNCTION__, "dispatch extend error", *p);
2918
- return pe;
2919
- }
2920
- else if (cs == EDN_dispatch_en_main) {} // silence ragel warning
3052
+ #line 871 "edn_parser.rl"
2921
3053
 
2922
- return nullptr;
3054
+ if (cs >= EDN_dispatch_first_final) {
3055
+ return p + 1;
3056
+ }
3057
+ else if (cs == EDN_dispatch_error) {
3058
+ error(__FUNCTION__, "dispatch extend error", *p);
3059
+ return pe;
3060
+ }
3061
+ else if (cs == EDN_dispatch_en_main) {} // silence ragel warning
3062
+ return nullptr;
2923
3063
  }
2924
3064
 
2925
3065
 
@@ -2927,7 +3067,7 @@ case 2:
2927
3067
  // set parsing machine
2928
3068
  //
2929
3069
 
2930
- #line 2931 "edn_parser.cc"
3070
+ #line 3071 "edn_parser.cc"
2931
3071
  static const int EDN_set_start = 1;
2932
3072
  static const int EDN_set_first_final = 4;
2933
3073
  static const int EDN_set_error = 0;
@@ -2935,7 +3075,7 @@ static const int EDN_set_error = 0;
2935
3075
  static const int EDN_set_en_main = 1;
2936
3076
 
2937
3077
 
2938
- #line 863 "edn_parser.rl"
3078
+ #line 899 "edn_parser.rl"
2939
3079
 
2940
3080
 
2941
3081
  //
@@ -2943,20 +3083,20 @@ static const int EDN_set_en_main = 1;
2943
3083
  //
2944
3084
  const char* edn::Parser::parse_set(const char *p, const char *pe, VALUE& v)
2945
3085
  {
2946
- static const char* EDN_TYPE = "set";
3086
+ static const char* EDN_TYPE = "set";
2947
3087
 
2948
- int cs;
2949
- VALUE elems; // holds the set's elements as an array allocated in @open_seq
3088
+ int cs;
3089
+ VALUE elems; // holds the set's elements as an array allocated in @open_seq
2950
3090
 
2951
3091
 
2952
- #line 2953 "edn_parser.cc"
3092
+ #line 3093 "edn_parser.cc"
2953
3093
  {
2954
3094
  cs = EDN_set_start;
2955
3095
  }
2956
3096
 
2957
- #line 876 "edn_parser.rl"
3097
+ #line 912 "edn_parser.rl"
2958
3098
 
2959
- #line 2960 "edn_parser.cc"
3099
+ #line 3100 "edn_parser.cc"
2960
3100
  {
2961
3101
  if ( p == pe )
2962
3102
  goto _test_eof;
@@ -2969,72 +3109,72 @@ case 1:
2969
3109
  tr2:
2970
3110
  #line 73 "edn_parser.rl"
2971
3111
  {
2972
- std::stringstream s;
2973
- s << "unterminated " << EDN_TYPE;
2974
- error(__FUNCTION__, s.str());
2975
- p--; {p++; cs = 0; goto _out;}
2976
- }
3112
+ std::stringstream s;
3113
+ s << "unterminated " << EDN_TYPE;
3114
+ error(__FUNCTION__, s.str());
3115
+ p--; {p++; cs = 0; goto _out;}
3116
+ }
2977
3117
  goto st0;
2978
- #line 2979 "edn_parser.cc"
3118
+ #line 3119 "edn_parser.cc"
2979
3119
  st0:
2980
3120
  cs = 0;
2981
3121
  goto _out;
2982
3122
  tr0:
2983
- #line 591 "edn_parser.rl"
2984
- {
2985
- // sequences store elements in an array, then process it to
2986
- // convert it to a list, set, or map as needed once the
2987
- // sequence end is reached
2988
- elems = rb_ary_new();
2989
- // additionally, metadata for elements in the sequence may be
2990
- // carried so we must push a new level in the metadata stack
2991
- new_meta_list();
2992
- }
3123
+ #line 629 "edn_parser.rl"
3124
+ {
3125
+ // sequences store elements in an array, then process it to
3126
+ // convert it to a list, set, or map as needed once the
3127
+ // sequence end is reached
3128
+ elems = rb_ary_new();
3129
+ // additionally, metadata for elements in the sequence may be
3130
+ // carried so we must push a new level in the metadata stack
3131
+ new_meta_list();
3132
+ }
2993
3133
  goto st2;
2994
3134
  tr4:
2995
3135
  #line 47 "edn_parser.rl"
2996
3136
  { line_number++; }
2997
3137
  goto st2;
2998
3138
  tr5:
2999
- #line 606 "edn_parser.rl"
3000
- {
3001
- // reads an item within a sequence (vector, list, map, or
3002
- // set). Regardless of the sequence type, an array of the
3003
- // items is built. Once done, the sequence parser will convert
3004
- // if needed
3005
- VALUE e;
3006
- std::size_t meta_sz = meta_size();
3007
- const char *np = parse_value(p, pe, e);
3008
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
3009
- // if there's an entry in the discard list, the current
3010
- // object is not meant to be kept due to a #_ so don't
3011
- // push it into the list of elements
3012
- if (!discard.empty()) {
3013
- discard.pop_back();
3139
+ #line 644 "edn_parser.rl"
3140
+ {
3141
+ // reads an item within a sequence (vector, list, map, or
3142
+ // set). Regardless of the sequence type, an array of the
3143
+ // items is built. Once done, the sequence parser will convert
3144
+ // if needed
3145
+ VALUE e;
3146
+ std::size_t meta_sz = meta_size();
3147
+ const char *np = parse_value(p, pe, e);
3148
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
3149
+ // if there's an entry in the discard list, the current
3150
+ // object is not meant to be kept due to a #_ so don't
3151
+ // push it into the list of elements
3152
+ if (!discard.empty()) {
3153
+ discard.pop_back();
3154
+ }
3155
+ else if (!meta_empty()) {
3156
+ // check if parse_value added metadata
3157
+ if (meta_size() == meta_sz) {
3158
+ // there's metadata and it didn't increase so
3159
+ // parse_value() read an element we care
3160
+ // about. Bind the metadata to it and add it to
3161
+ // the sequence
3162
+ e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
3163
+ rb_ary_push(elems, e);
3014
3164
  }
3015
- else if (!meta_empty()) {
3016
- // check if parse_value added metadata
3017
- if (meta_size() == meta_sz) {
3018
- // there's metadata and it didn't increase so
3019
- // parse_value() read an element we care
3020
- // about. Bind the metadata to it and add it to
3021
- // the sequence
3022
- e = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
3023
- rb_ary_push(elems, e);
3024
- }
3025
- } else {
3026
- // no metadata.. just push it
3027
- rb_ary_push(elems, e);
3028
- }
3029
- {p = (( np))-1;}
3030
- }
3031
- }
3165
+ } else {
3166
+ // no metadata.. just push it
3167
+ rb_ary_push(elems, e);
3168
+ }
3169
+ {p = (( np))-1;}
3170
+ }
3171
+ }
3032
3172
  goto st2;
3033
3173
  st2:
3034
3174
  if ( ++p == pe )
3035
3175
  goto _test_eof2;
3036
3176
  case 2:
3037
- #line 3038 "edn_parser.cc"
3177
+ #line 3178 "edn_parser.cc"
3038
3178
  switch( (*p) ) {
3039
3179
  case 10: goto tr4;
3040
3180
  case 32: goto st2;
@@ -3068,11 +3208,11 @@ case 3:
3068
3208
  goto tr4;
3069
3209
  goto st3;
3070
3210
  tr7:
3071
- #line 601 "edn_parser.rl"
3211
+ #line 639 "edn_parser.rl"
3072
3212
  {
3073
- // remove the current metadata level
3074
- del_top_meta_list();
3075
- }
3213
+ // remove the current metadata level
3214
+ del_top_meta_list();
3215
+ }
3076
3216
  #line 80 "edn_parser.rl"
3077
3217
  { p--; {p++; cs = 4; goto _out;} }
3078
3218
  goto st4;
@@ -3080,7 +3220,7 @@ st4:
3080
3220
  if ( ++p == pe )
3081
3221
  goto _test_eof4;
3082
3222
  case 4:
3083
- #line 3084 "edn_parser.cc"
3223
+ #line 3224 "edn_parser.cc"
3084
3224
  goto st0;
3085
3225
  }
3086
3226
  _test_eof2: cs = 2; goto _test_eof;
@@ -3095,32 +3235,32 @@ case 4:
3095
3235
  case 3:
3096
3236
  #line 73 "edn_parser.rl"
3097
3237
  {
3098
- std::stringstream s;
3099
- s << "unterminated " << EDN_TYPE;
3100
- error(__FUNCTION__, s.str());
3101
- p--; {p++; cs = 0; goto _out;}
3102
- }
3238
+ std::stringstream s;
3239
+ s << "unterminated " << EDN_TYPE;
3240
+ error(__FUNCTION__, s.str());
3241
+ p--; {p++; cs = 0; goto _out;}
3242
+ }
3103
3243
  break;
3104
- #line 3105 "edn_parser.cc"
3244
+ #line 3245 "edn_parser.cc"
3105
3245
  }
3106
3246
  }
3107
3247
 
3108
3248
  _out: {}
3109
3249
  }
3110
3250
 
3111
- #line 877 "edn_parser.rl"
3251
+ #line 913 "edn_parser.rl"
3112
3252
 
3113
- if (cs >= EDN_set_first_final) {
3114
- // all elements collected; now convert to a set
3115
- v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SET_METHOD, elems);
3116
- return p + 1;
3117
- }
3118
- else if (cs == EDN_set_error) {
3119
- error(__FUNCTION__, *p);
3120
- return pe;
3121
- }
3122
- else if (cs == EDN_set_en_main) {} // silence ragel warning
3123
- return nullptr;
3253
+ if (cs >= EDN_set_first_final) {
3254
+ // all elements collected; now convert to a set
3255
+ v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SET_METHOD, elems);
3256
+ return p + 1;
3257
+ }
3258
+ else if (cs == EDN_set_error) {
3259
+ error(__FUNCTION__, *p);
3260
+ return pe;
3261
+ }
3262
+ else if (cs == EDN_set_en_main) {} // silence ragel warning
3263
+ return nullptr;
3124
3264
  }
3125
3265
 
3126
3266
 
@@ -3131,7 +3271,7 @@ case 4:
3131
3271
  // defining a machine to consume items within container delimiters
3132
3272
  //
3133
3273
 
3134
- #line 3135 "edn_parser.cc"
3274
+ #line 3275 "edn_parser.cc"
3135
3275
  static const int EDN_discard_start = 1;
3136
3276
  static const int EDN_discard_first_final = 4;
3137
3277
  static const int EDN_discard_error = 0;
@@ -3139,24 +3279,24 @@ static const int EDN_discard_error = 0;
3139
3279
  static const int EDN_discard_en_main = 1;
3140
3280
 
3141
3281
 
3142
- #line 927 "edn_parser.rl"
3282
+ #line 963 "edn_parser.rl"
3143
3283
 
3144
3284
 
3145
3285
 
3146
3286
  const char* edn::Parser::parse_discard(const char *p, const char *pe)
3147
3287
  {
3148
- int cs;
3149
- VALUE v;
3288
+ int cs;
3289
+ VALUE v;
3150
3290
 
3151
3291
 
3152
- #line 3153 "edn_parser.cc"
3292
+ #line 3293 "edn_parser.cc"
3153
3293
  {
3154
3294
  cs = EDN_discard_start;
3155
3295
  }
3156
3296
 
3157
- #line 936 "edn_parser.rl"
3297
+ #line 972 "edn_parser.rl"
3158
3298
 
3159
- #line 3160 "edn_parser.cc"
3299
+ #line 3300 "edn_parser.cc"
3160
3300
  {
3161
3301
  if ( p == pe )
3162
3302
  goto _test_eof;
@@ -3167,15 +3307,15 @@ case 1:
3167
3307
  goto st2;
3168
3308
  goto st0;
3169
3309
  tr2:
3170
- #line 917 "edn_parser.rl"
3310
+ #line 953 "edn_parser.rl"
3171
3311
  {
3172
- std::stringstream s;
3173
- s << "discard sequence without element to discard";
3174
- error(__FUNCTION__, s.str());
3175
- p--; {p++; cs = 0; goto _out;}
3176
- }
3312
+ std::stringstream s;
3313
+ s << "discard sequence without element to discard";
3314
+ error(__FUNCTION__, s.str());
3315
+ p--; {p++; cs = 0; goto _out;}
3316
+ }
3177
3317
  goto st0;
3178
- #line 3179 "edn_parser.cc"
3318
+ #line 3319 "edn_parser.cc"
3179
3319
  st0:
3180
3320
  cs = 0;
3181
3321
  goto _out;
@@ -3187,7 +3327,7 @@ st2:
3187
3327
  if ( ++p == pe )
3188
3328
  goto _test_eof2;
3189
3329
  case 2:
3190
- #line 3191 "edn_parser.cc"
3330
+ #line 3331 "edn_parser.cc"
3191
3331
  switch( (*p) ) {
3192
3332
  case 10: goto tr3;
3193
3333
  case 32: goto st2;
@@ -3213,17 +3353,17 @@ case 2:
3213
3353
  goto tr4;
3214
3354
  goto tr2;
3215
3355
  tr4:
3216
- #line 906 "edn_parser.rl"
3217
- {
3218
- const char *np = parse_value(p, pe, v);
3219
- if (np == nullptr) { p--; {p++; cs = 4; goto _out;} } else {
3220
- // this token is to be discarded so store it in the
3221
- // discard stack - we really don't need to save it so this
3222
- // could be simplified
3223
- discard.push_back(v);
3224
- {p = (( np))-1;}
3225
- }
3226
- }
3356
+ #line 942 "edn_parser.rl"
3357
+ {
3358
+ const char *np = parse_value(p, pe, v);
3359
+ if (np == nullptr) { p--; {p++; cs = 4; goto _out;} } else {
3360
+ // this token is to be discarded so store it in the
3361
+ // discard stack - we really don't need to save it so this
3362
+ // could be simplified
3363
+ discard.push_back(v);
3364
+ {p = (( np))-1;}
3365
+ }
3366
+ }
3227
3367
  #line 80 "edn_parser.rl"
3228
3368
  { p--; {p++; cs = 4; goto _out;} }
3229
3369
  goto st4;
@@ -3231,7 +3371,7 @@ st4:
3231
3371
  if ( ++p == pe )
3232
3372
  goto _test_eof4;
3233
3373
  case 4:
3234
- #line 3235 "edn_parser.cc"
3374
+ #line 3375 "edn_parser.cc"
3235
3375
  goto st0;
3236
3376
  st3:
3237
3377
  if ( ++p == pe )
@@ -3250,33 +3390,32 @@ case 3:
3250
3390
  {
3251
3391
  switch ( cs ) {
3252
3392
  case 2:
3253
- #line 917 "edn_parser.rl"
3393
+ #line 953 "edn_parser.rl"
3254
3394
  {
3255
- std::stringstream s;
3256
- s << "discard sequence without element to discard";
3257
- error(__FUNCTION__, s.str());
3258
- p--; {p++; cs = 0; goto _out;}
3259
- }
3395
+ std::stringstream s;
3396
+ s << "discard sequence without element to discard";
3397
+ error(__FUNCTION__, s.str());
3398
+ p--; {p++; cs = 0; goto _out;}
3399
+ }
3260
3400
  break;
3261
- #line 3262 "edn_parser.cc"
3401
+ #line 3402 "edn_parser.cc"
3262
3402
  }
3263
3403
  }
3264
3404
 
3265
3405
  _out: {}
3266
3406
  }
3267
3407
 
3268
- #line 937 "edn_parser.rl"
3408
+ #line 973 "edn_parser.rl"
3269
3409
 
3270
- if (cs >= EDN_discard_first_final) {
3271
- return p + 1;
3272
- }
3273
- else if (cs == EDN_discard_error) {
3274
- error(__FUNCTION__, *p);
3275
- return pe;
3276
- }
3277
- else if (cs == EDN_discard_en_main) {} // silence ragel warning
3278
-
3279
- return nullptr;
3410
+ if (cs >= EDN_discard_first_final) {
3411
+ return p + 1;
3412
+ }
3413
+ else if (cs == EDN_discard_error) {
3414
+ error(__FUNCTION__, *p);
3415
+ return pe;
3416
+ }
3417
+ else if (cs == EDN_discard_en_main) {} // silence ragel warning
3418
+ return nullptr;
3280
3419
  }
3281
3420
 
3282
3421
 
@@ -3296,7 +3435,7 @@ case 3:
3296
3435
  // 2. add parse checks for uuid and inst for better error reporting
3297
3436
  //
3298
3437
 
3299
- #line 3300 "edn_parser.cc"
3438
+ #line 3439 "edn_parser.cc"
3300
3439
  static const int EDN_tagged_start = 1;
3301
3440
  static const int EDN_tagged_first_final = 7;
3302
3441
  static const int EDN_tagged_error = 0;
@@ -3304,28 +3443,28 @@ static const int EDN_tagged_error = 0;
3304
3443
  static const int EDN_tagged_en_main = 1;
3305
3444
 
3306
3445
 
3307
- #line 1005 "edn_parser.rl"
3446
+ #line 1040 "edn_parser.rl"
3308
3447
 
3309
3448
 
3310
3449
 
3311
3450
  const char* edn::Parser::parse_tagged(const char *p, const char *pe, VALUE& v)
3312
3451
  {
3313
- VALUE sym_name = Qnil;
3314
- VALUE data = Qnil;
3315
- bool sym_ok = false;
3316
- bool data_ok = false;
3452
+ VALUE sym_name = Qnil;
3453
+ VALUE data = Qnil;
3454
+ bool sym_ok = false;
3455
+ bool data_ok = false;
3317
3456
 
3318
- int cs;
3457
+ int cs;
3319
3458
 
3320
3459
 
3321
- #line 3322 "edn_parser.cc"
3460
+ #line 3461 "edn_parser.cc"
3322
3461
  {
3323
3462
  cs = EDN_tagged_start;
3324
3463
  }
3325
3464
 
3326
- #line 1018 "edn_parser.rl"
3465
+ #line 1053 "edn_parser.rl"
3327
3466
 
3328
- #line 3329 "edn_parser.cc"
3467
+ #line 3468 "edn_parser.cc"
3329
3468
  {
3330
3469
  if ( p == pe )
3331
3470
  goto _test_eof;
@@ -3342,21 +3481,21 @@ st0:
3342
3481
  cs = 0;
3343
3482
  goto _out;
3344
3483
  tr0:
3345
- #line 984 "edn_parser.rl"
3346
- {
3347
- // parses the symbol portion of the pair
3348
- const char *np = parse_symbol(p, pe, sym_name);
3349
- if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
3350
- sym_ok = true;
3351
- {p = (( np))-1;}
3352
- }
3353
- }
3484
+ #line 1019 "edn_parser.rl"
3485
+ {
3486
+ // parses the symbol portion of the pair
3487
+ const char *np = parse_symbol(p, pe, sym_name);
3488
+ if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
3489
+ sym_ok = true;
3490
+ {p = (( np))-1;}
3491
+ }
3492
+ }
3354
3493
  goto st2;
3355
3494
  st2:
3356
3495
  if ( ++p == pe )
3357
3496
  goto _test_eof2;
3358
3497
  case 2:
3359
- #line 3360 "edn_parser.cc"
3498
+ #line 3499 "edn_parser.cc"
3360
3499
  switch( (*p) ) {
3361
3500
  case 10: goto tr3;
3362
3501
  case 32: goto st3;
@@ -3389,7 +3528,7 @@ st3:
3389
3528
  if ( ++p == pe )
3390
3529
  goto _test_eof3;
3391
3530
  case 3:
3392
- #line 3393 "edn_parser.cc"
3531
+ #line 3532 "edn_parser.cc"
3393
3532
  switch( (*p) ) {
3394
3533
  case 10: goto tr3;
3395
3534
  case 32: goto st3;
@@ -3415,15 +3554,15 @@ case 3:
3415
3554
  goto tr7;
3416
3555
  goto st0;
3417
3556
  tr7:
3418
- #line 992 "edn_parser.rl"
3419
- {
3420
- // parses the value portion
3421
- const char *np = parse_value(p, pe, data);
3422
- if (np == nullptr) { p--; {p++; cs = 7; goto _out;} } else {
3423
- data_ok = true;
3424
- {p = (( np))-1;}
3425
- }
3426
- }
3557
+ #line 1027 "edn_parser.rl"
3558
+ {
3559
+ // parses the value portion
3560
+ const char *np = parse_value(p, pe, data);
3561
+ if (np == nullptr) { p--; {p++; cs = 7; goto _out;} } else {
3562
+ data_ok = true;
3563
+ {p = (( np))-1;}
3564
+ }
3565
+ }
3427
3566
  #line 80 "edn_parser.rl"
3428
3567
  { p--; {p++; cs = 7; goto _out;} }
3429
3568
  goto st7;
@@ -3431,7 +3570,7 @@ st7:
3431
3570
  if ( ++p == pe )
3432
3571
  goto _test_eof7;
3433
3572
  case 7:
3434
- #line 3435 "edn_parser.cc"
3573
+ #line 3574 "edn_parser.cc"
3435
3574
  goto st0;
3436
3575
  st4:
3437
3576
  if ( ++p == pe )
@@ -3509,45 +3648,43 @@ case 6:
3509
3648
  _out: {}
3510
3649
  }
3511
3650
 
3512
- #line 1019 "edn_parser.rl"
3651
+ #line 1054 "edn_parser.rl"
3513
3652
 
3514
- if (cs >= EDN_tagged_first_final) {
3653
+ if (cs >= EDN_tagged_first_final) {
3515
3654
  //std::cerr << __FUNCTION__ << " parse symbol name as '" << sym_name << "', value is: " << data << std::endl;
3516
3655
 
3517
- if (!sym_ok || !data_ok) {
3518
- error(__FUNCTION__, "tagged element symbol error", *p);
3519
- v = EDN_EOF_CONST;
3520
- return nullptr;
3521
- }
3522
-
3523
- try {
3524
- // tagged_element makes a call to ruby which may throw an
3525
- // exception when parsing the data
3526
- v = edn::util::call_module_fn(rb_mEDN, EDN_TAGGED_ELEM_METHOD, sym_name, data);
3527
- return p + 1;
3528
- } catch (std::exception& e) {
3529
- error(__FUNCTION__, e.what());
3530
- return pe;
3531
- }
3532
- }
3533
- else if (cs == EDN_tagged_error) {
3534
- error(__FUNCTION__, "tagged element symbol error", *p);
3535
- }
3536
- else if (cs == EDN_tagged_en_main) {} // silence ragel warning
3537
- v = EDN_EOF_CONST;
3538
- return nullptr;
3656
+ if (!sym_ok || !data_ok) {
3657
+ error(__FUNCTION__, "tagged element symbol error", *p);
3658
+ v = EDN_EOF_CONST;
3659
+ return nullptr;
3660
+ }
3661
+
3662
+ try {
3663
+ // tagged_element makes a call to ruby which may throw an
3664
+ // exception when parsing the data
3665
+ v = edn::util::call_module_fn(rb_mEDN, EDN_TAGGED_ELEM_METHOD, sym_name, data);
3666
+ return p + 1;
3667
+ } catch (std::exception& e) {
3668
+ error(__FUNCTION__, e.what());
3669
+ return pe;
3670
+ }
3671
+ }
3672
+ else if (cs == EDN_tagged_error) {
3673
+ error(__FUNCTION__, "tagged element symbol error", *p);
3674
+ }
3675
+ else if (cs == EDN_tagged_en_main) {} // silence ragel warning
3676
+ v = EDN_EOF_CONST;
3677
+ return nullptr;
3539
3678
  }
3540
3679
 
3541
3680
 
3542
-
3543
-
3544
3681
  // ============================================================
3545
3682
  // metadata - looks like ruby just discards this but we'll track it
3546
3683
  // and provide a means to retrive after each parse op - might be
3547
3684
  // useful?
3548
3685
  //
3549
3686
 
3550
- #line 3551 "edn_parser.cc"
3687
+ #line 3688 "edn_parser.cc"
3551
3688
  static const int EDN_meta_start = 1;
3552
3689
  static const int EDN_meta_first_final = 3;
3553
3690
  static const int EDN_meta_error = 0;
@@ -3555,24 +3692,24 @@ static const int EDN_meta_error = 0;
3555
3692
  static const int EDN_meta_en_main = 1;
3556
3693
 
3557
3694
 
3558
- #line 1069 "edn_parser.rl"
3695
+ #line 1102 "edn_parser.rl"
3559
3696
 
3560
3697
 
3561
3698
 
3562
3699
  const char* edn::Parser::parse_meta(const char *p, const char *pe)
3563
3700
  {
3564
- int cs;
3565
- VALUE v;
3701
+ int cs;
3702
+ VALUE v;
3566
3703
 
3567
3704
 
3568
- #line 3569 "edn_parser.cc"
3705
+ #line 3706 "edn_parser.cc"
3569
3706
  {
3570
3707
  cs = EDN_meta_start;
3571
3708
  }
3572
3709
 
3573
- #line 1078 "edn_parser.rl"
3710
+ #line 1111 "edn_parser.rl"
3574
3711
 
3575
- #line 3576 "edn_parser.cc"
3712
+ #line 3713 "edn_parser.cc"
3576
3713
  {
3577
3714
  if ( p == pe )
3578
3715
  goto _test_eof;
@@ -3611,11 +3748,11 @@ case 2:
3611
3748
  goto tr2;
3612
3749
  goto st0;
3613
3750
  tr2:
3614
- #line 1061 "edn_parser.rl"
3751
+ #line 1094 "edn_parser.rl"
3615
3752
  {
3616
- const char *np = parse_value(p, pe, v);
3617
- if (np == nullptr) { p--; {p++; cs = 3; goto _out;} } else { {p = (( np))-1;} }
3618
- }
3753
+ const char *np = parse_value(p, pe, v);
3754
+ if (np == nullptr) { p--; {p++; cs = 3; goto _out;} } else { {p = (( np))-1;} }
3755
+ }
3619
3756
  #line 80 "edn_parser.rl"
3620
3757
  { p--; {p++; cs = 3; goto _out;} }
3621
3758
  goto st3;
@@ -3623,7 +3760,7 @@ st3:
3623
3760
  if ( ++p == pe )
3624
3761
  goto _test_eof3;
3625
3762
  case 3:
3626
- #line 3627 "edn_parser.cc"
3763
+ #line 3764 "edn_parser.cc"
3627
3764
  goto st0;
3628
3765
  }
3629
3766
  _test_eof2: cs = 2; goto _test_eof;
@@ -3633,19 +3770,18 @@ case 3:
3633
3770
  _out: {}
3634
3771
  }
3635
3772
 
3636
- #line 1079 "edn_parser.rl"
3773
+ #line 1112 "edn_parser.rl"
3637
3774
 
3638
- if (cs >= EDN_meta_first_final) {
3639
- append_to_meta(v);
3640
- return p + 1;
3641
- }
3642
- else if (cs == EDN_meta_error) {
3643
- error(__FUNCTION__, *p);
3644
- return pe;
3645
- }
3646
- else if (cs == EDN_meta_en_main) {} // silence ragel warning
3647
-
3648
- return nullptr;
3775
+ if (cs >= EDN_meta_first_final) {
3776
+ append_to_meta(v);
3777
+ return p + 1;
3778
+ }
3779
+ else if (cs == EDN_meta_error) {
3780
+ error(__FUNCTION__, *p);
3781
+ return pe;
3782
+ }
3783
+ else if (cs == EDN_meta_en_main) {} // silence ragel warning
3784
+ return nullptr;
3649
3785
  }
3650
3786
 
3651
3787
 
@@ -3655,7 +3791,7 @@ case 3:
3655
3791
  // top-level, therefore, does not tokenize source stream
3656
3792
  //
3657
3793
 
3658
- #line 3659 "edn_parser.cc"
3794
+ #line 3795 "edn_parser.cc"
3659
3795
  static const int EDN_parser_start = 2;
3660
3796
  static const int EDN_parser_first_final = 2;
3661
3797
  static const int EDN_parser_error = 0;
@@ -3663,25 +3799,25 @@ static const int EDN_parser_error = 0;
3663
3799
  static const int EDN_parser_en_main = 2;
3664
3800
 
3665
3801
 
3666
- #line 1128 "edn_parser.rl"
3802
+ #line 1160 "edn_parser.rl"
3667
3803
 
3668
3804
 
3669
3805
 
3670
3806
  VALUE edn::Parser::parse(const char* src, std::size_t len)
3671
3807
  {
3672
- int cs;
3673
- VALUE result = EDN_EOF_CONST;
3808
+ int cs;
3809
+ VALUE result = EDN_EOF_CONST;
3674
3810
 
3675
3811
 
3676
- #line 3677 "edn_parser.cc"
3812
+ #line 3813 "edn_parser.cc"
3677
3813
  {
3678
3814
  cs = EDN_parser_start;
3679
3815
  }
3680
3816
 
3681
- #line 1137 "edn_parser.rl"
3682
- set_source(src, len);
3817
+ #line 1169 "edn_parser.rl"
3818
+ set_source(src, len);
3683
3819
 
3684
- #line 3685 "edn_parser.cc"
3820
+ #line 3821 "edn_parser.cc"
3685
3821
  {
3686
3822
  if ( p == pe )
3687
3823
  goto _test_eof;
@@ -3692,30 +3828,30 @@ tr1:
3692
3828
  { line_number++; }
3693
3829
  goto st2;
3694
3830
  tr4:
3695
- #line 1105 "edn_parser.rl"
3696
- {
3697
- // save the count of metadata items before we parse this value
3698
- // so we can determine if we've read another metadata value or
3699
- // an actual data item
3700
- std::size_t meta_sz = meta_size();
3701
- const char* np = parse_value(p, pe, result);
3702
- if (np == nullptr) { {p = (( pe))-1;} {p++; cs = 2; goto _out;} } else {
3703
- // if we have metadata saved and it matches the count we
3704
- // saved before we parsed a value, then we must bind the
3705
- // metadata sequence to it
3706
- if (!meta_empty() && meta_size() == meta_sz) {
3707
- // this will empty the metadata sequence too
3708
- result = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, result, ruby_meta());
3709
- }
3710
- {p = (( np))-1;}
3711
- }
3712
- }
3831
+ #line 1137 "edn_parser.rl"
3832
+ {
3833
+ // save the count of metadata items before we parse this value
3834
+ // so we can determine if we've read another metadata value or
3835
+ // an actual data item
3836
+ std::size_t meta_sz = meta_size();
3837
+ const char* np = parse_value(p, pe, result);
3838
+ if (np == nullptr) { {p = (( pe))-1;} {p++; cs = 2; goto _out;} } else {
3839
+ // if we have metadata saved and it matches the count we
3840
+ // saved before we parsed a value, then we must bind the
3841
+ // metadata sequence to it
3842
+ if (!meta_empty() && meta_size() == meta_sz) {
3843
+ // this will empty the metadata sequence too
3844
+ result = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, result, ruby_meta());
3845
+ }
3846
+ {p = (( np))-1;}
3847
+ }
3848
+ }
3713
3849
  goto st2;
3714
3850
  st2:
3715
3851
  if ( ++p == pe )
3716
3852
  goto _test_eof2;
3717
3853
  case 2:
3718
- #line 3719 "edn_parser.cc"
3854
+ #line 3855 "edn_parser.cc"
3719
3855
  switch( (*p) ) {
3720
3856
  case 10: goto tr1;
3721
3857
  case 32: goto st2;
@@ -3758,17 +3894,17 @@ case 1:
3758
3894
  _out: {}
3759
3895
  }
3760
3896
 
3761
- #line 1139 "edn_parser.rl"
3897
+ #line 1171 "edn_parser.rl"
3762
3898
 
3763
- if (cs == EDN_parser_error) {
3764
- error(__FUNCTION__, *p);
3765
- return EDN_EOF_CONST;
3766
- }
3767
- else if (cs == EDN_parser_first_final) {
3768
- p = pe = eof = nullptr;
3769
- }
3770
- else if (cs == EDN_parser_en_main) {} // silence ragel warning
3771
- return result;
3899
+ if (cs == EDN_parser_error) {
3900
+ error(__FUNCTION__, *p);
3901
+ return EDN_EOF_CONST;
3902
+ }
3903
+ else if (cs == EDN_parser_first_final) {
3904
+ p = pe = eof = nullptr;
3905
+ }
3906
+ else if (cs == EDN_parser_en_main) {} // silence ragel warning
3907
+ return result;
3772
3908
  }
3773
3909
 
3774
3910
 
@@ -3776,13 +3912,13 @@ case 1:
3776
3912
  // token-by-token machine
3777
3913
  //
3778
3914
 
3779
- #line 3780 "edn_parser.cc"
3915
+ #line 3916 "edn_parser.cc"
3780
3916
  static const int EDN_tokens_start = 1;
3781
3917
 
3782
3918
  static const int EDN_tokens_en_main = 1;
3783
3919
 
3784
3920
 
3785
- #line 1193 "edn_parser.rl"
3921
+ #line 1225 "edn_parser.rl"
3786
3922
 
3787
3923
 
3788
3924
 
@@ -3790,25 +3926,25 @@ static const int EDN_tokens_en_main = 1;
3790
3926
  //
3791
3927
  edn::Parser::eTokenState edn::Parser::parse_next(VALUE& value)
3792
3928
  {
3793
- int cs;
3794
- eTokenState state = TOKEN_ERROR;
3795
- // need to track metadada read and bind it to the next value read
3796
- // - but must account for sequences of metadata values
3797
- std::size_t meta_sz;
3929
+ int cs;
3930
+ eTokenState state = TOKEN_ERROR;
3931
+ // need to track metadada read and bind it to the next value read
3932
+ // - but must account for sequences of metadata values
3933
+ std::size_t meta_sz;
3798
3934
 
3799
- // clear any previously saved discards; only track if read during
3800
- // this op
3801
- discard.clear();
3935
+ // clear any previously saved discards; only track if read during
3936
+ // this op
3937
+ discard.clear();
3802
3938
 
3803
3939
 
3804
- #line 3805 "edn_parser.cc"
3940
+ #line 3941 "edn_parser.cc"
3805
3941
  {
3806
3942
  cs = EDN_tokens_start;
3807
3943
  }
3808
3944
 
3809
- #line 1211 "edn_parser.rl"
3945
+ #line 1243 "edn_parser.rl"
3810
3946
 
3811
- #line 3812 "edn_parser.cc"
3947
+ #line 3948 "edn_parser.cc"
3812
3948
  {
3813
3949
  if ( p == pe )
3814
3950
  goto _test_eof;
@@ -3822,7 +3958,7 @@ st1:
3822
3958
  if ( ++p == pe )
3823
3959
  goto _test_eof1;
3824
3960
  case 1:
3825
- #line 3826 "edn_parser.cc"
3961
+ #line 3962 "edn_parser.cc"
3826
3962
  switch( (*p) ) {
3827
3963
  case 10: goto tr2;
3828
3964
  case 32: goto st1;
@@ -3855,43 +3991,43 @@ tr6:
3855
3991
  { line_number++; }
3856
3992
  goto st4;
3857
3993
  tr3:
3858
- #line 1161 "edn_parser.rl"
3859
- {
3860
- // we won't know if we've parsed a discard or a metadata until
3861
- // after parse_value() is done. Save the current number of
3862
- // elements in the metadata sequence; then we can check if it
3863
- // grew or if the discard sequence grew
3864
- meta_sz = meta_size();
3865
-
3866
- const char* np = parse_value(p, pe, value);
3867
- if (np == nullptr) { p--; {p++; cs = 4; goto _out;} } else {
3868
- if (!meta_empty()) {
3869
- // was an additional metadata entry read? if so, don't
3870
- // return a value
3871
- if (meta_size() > meta_sz) {
3872
- state = TOKEN_IS_META;
3873
- }
3874
- else {
3875
- // a value was read and there's a pending metadata
3876
- // sequence. Bind them.
3877
- value = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, value, ruby_meta());
3878
- state = TOKEN_OK;
3879
- }
3880
- } else if (!discard.empty()) {
3881
- // a discard read. Don't return a value
3882
- state = TOKEN_IS_DISCARD;
3883
- } else {
3884
- state = TOKEN_OK;
3994
+ #line 1193 "edn_parser.rl"
3995
+ {
3996
+ // we won't know if we've parsed a discard or a metadata until
3997
+ // after parse_value() is done. Save the current number of
3998
+ // elements in the metadata sequence; then we can check if it
3999
+ // grew or if the discard sequence grew
4000
+ meta_sz = meta_size();
4001
+
4002
+ const char* np = parse_value(p, pe, value);
4003
+ if (np == nullptr) { p--; {p++; cs = 4; goto _out;} } else {
4004
+ if (!meta_empty()) {
4005
+ // was an additional metadata entry read? if so, don't
4006
+ // return a value
4007
+ if (meta_size() > meta_sz) {
4008
+ state = TOKEN_IS_META;
4009
+ }
4010
+ else {
4011
+ // a value was read and there's a pending metadata
4012
+ // sequence. Bind them.
4013
+ value = edn::util::call_module_fn(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, value, ruby_meta());
4014
+ state = TOKEN_OK;
3885
4015
  }
3886
- {p = (( np))-1;}
3887
- }
3888
- }
4016
+ } else if (!discard.empty()) {
4017
+ // a discard read. Don't return a value
4018
+ state = TOKEN_IS_DISCARD;
4019
+ } else {
4020
+ state = TOKEN_OK;
4021
+ }
4022
+ {p = (( np))-1;}
4023
+ }
4024
+ }
3889
4025
  goto st4;
3890
4026
  st4:
3891
4027
  if ( ++p == pe )
3892
4028
  goto _test_eof4;
3893
4029
  case 4:
3894
- #line 3895 "edn_parser.cc"
4030
+ #line 4031 "edn_parser.cc"
3895
4031
  switch( (*p) ) {
3896
4032
  case 10: goto tr6;
3897
4033
  case 32: goto st4;
@@ -3925,10 +4061,10 @@ case 3:
3925
4061
  _out: {}
3926
4062
  }
3927
4063
 
3928
- #line 1212 "edn_parser.rl"
4064
+ #line 1244 "edn_parser.rl"
3929
4065
 
3930
- if (cs == EDN_tokens_en_main) {} // silence ragel warning
3931
- return state;
4066
+ if (cs == EDN_tokens_en_main) {} // silence ragel warning
4067
+ return state;
3932
4068
  }
3933
4069
 
3934
4070
  /*