edn_turbo 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +54 -9
- data/ext/edn_turbo/edn_parser.cc +493 -370
- data/ext/edn_turbo/edn_parser.h +48 -47
- data/ext/edn_turbo/edn_parser.rl +138 -107
- data/ext/edn_turbo/edn_parser_util.cc +122 -28
- data/ext/edn_turbo/extconf.rb +1 -1
- data/ext/edn_turbo/main.cc +90 -15
- data/lib/edn_turbo.rb +1 -1
- data/lib/edn_turbo/edn_parser.rb +19 -2
- data/lib/edn_turbo/version.rb +2 -2
- data/test/test_output_diff.rb +8 -8
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bedae4e49919f1fb8b5eb7ac3438288353ba840
|
4
|
+
data.tar.gz: a1685384d17a698d5ea050aa5557e7106be81c21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 762c77382240141aaab80528a5fae3865d789a7740401215320b9416d078df72acaea10512fe0a9967307ab997ed4c68a0fb9bcf2d71248bac8155811ddfcea0
|
7
|
+
data.tar.gz: 644544230a2dcceb3139fedf9d83071c13b653746f40e041a512bdf8de5797d35890516aeaa15ae6059322c960038eabce3636e332ccefe8c9403e9abfc563c5
|
data/README.md
CHANGED
@@ -18,13 +18,13 @@ and `edn_turbo` (see [issue 12](https://github.com/relevance/edn-ruby/issues/12)
|
|
18
18
|
irb(main):004:0> s = "[{\"x\" {\"id\" \"/model/952\", \"model_name\" \"person\", \"ancestors\" [\"record\" \"asset\"], \"format\" \"edn\"}, \"id\" 952, \"name\" nil, \"model_name\" \"person\", \"rel\" {}, \"description\" nil, \"age\" nil, \"updated_at\" nil, \"created_at\" nil, \"anniversary\" nil, \"job\" nil, \"start_date\" nil, \"username\" nil, \"vacation_start\" nil, \"vacation_end\" nil, \"expenses\" nil, \"rate\" nil, \"display_name\" nil, \"gross_profit_per_month\" nil}]"
|
19
19
|
=> "[{\"x\" {\"id\" \"/model/952\", \"model_name\" \"person\", \"ancestors\" [\"record\" \"asset\"], \"format\" \"edn\"}, \"id\" 952, \"name\" nil, \"model_name\" \"person\", \"rel\" {}, \"description\" nil, \"age\" nil, \"updated_at\" nil, \"created_at\" nil, \"anniversary\" nil, \"job\" nil, \"start_date\" nil, \"username\" nil, \"vacation_start\" nil, \"vacation_end\" nil, \"expenses\" nil, \"rate\" nil, \"display_name\" nil, \"gross_profit_per_month\" nil}]"
|
20
20
|
irb(main):005:0> Benchmark.realtime { 100.times { EDN::read(s) } }
|
21
|
-
=> 0.
|
21
|
+
=> 0.078503
|
22
22
|
irb(main):006:0> Benchmark.realtime { 100.times { EDNT::read(s) } }
|
23
|
-
=> 0.
|
23
|
+
=> 0.002669
|
24
24
|
irb(main):007:0> Benchmark.realtime { 100000.times { EDN::read(s) } }
|
25
|
-
=>
|
25
|
+
=> 75.219344
|
26
26
|
irb(main):008:0> Benchmark.realtime { 100000.times { EDNT::read(s) } }
|
27
|
-
=>
|
27
|
+
=> 2.560593
|
28
28
|
```
|
29
29
|
|
30
30
|
Dependencies
|
@@ -33,15 +33,25 @@ Dependencies
|
|
33
33
|
- ruby gems:
|
34
34
|
- [rake 10.3.2](http://rake.rubyforge.org)
|
35
35
|
- [rake-compiler 0.9.2](http://rake-compiler.rubyforge.org)
|
36
|
-
- [rice 1.7.0](http://rice.rubyforge.org)
|
37
36
|
- [edn 1.0.7](https://github.com/relevance/edn-ruby)
|
38
37
|
- [icu4c](http://icu-project.org/apiref/icu4c/)
|
39
38
|
|
40
|
-
|
41
|
-
|
39
|
+
|
40
|
+
Notes:
|
41
|
+
------
|
42
|
+
|
43
|
+
- `edn_turbo` uses a ragel-based parser but the generated .cc file is
|
44
|
+
bundled so ragel should not need to be installed.
|
45
|
+
|
46
|
+
- As of 0.3.0, [rice](http://rice.rubyforge.org) is no longer
|
47
|
+
required.
|
48
|
+
|
42
49
|
|
43
50
|
Usage
|
44
51
|
=====
|
52
|
+
|
53
|
+
Simlar to `edn-ruby`:
|
54
|
+
|
45
55
|
```ruby
|
46
56
|
require 'edn_turbo'
|
47
57
|
|
@@ -49,10 +59,45 @@ Usage
|
|
49
59
|
output = EDNT.read(file)
|
50
60
|
pp output if output != nil
|
51
61
|
end
|
62
|
+
|
63
|
+
# also accepts a string
|
64
|
+
pp EDNT.read("[ 1 2 3 abc ]")
|
65
|
+
|
66
|
+
```
|
67
|
+
|
68
|
+
Or instantiate and reuse an instance of a parser:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
require 'edn_turbo'
|
72
|
+
|
73
|
+
p = EDNT::Parser.new
|
74
|
+
File.open(filename) do |file|
|
75
|
+
output = p.parse(file)
|
76
|
+
pp output if output != nil
|
77
|
+
end
|
78
|
+
|
79
|
+
# with a string
|
80
|
+
pp p.parse("[ 1 2 3 abc ]")
|
81
|
+
|
82
|
+
|
83
|
+
# set new input
|
84
|
+
s = "(1) :abc { 1 2 }"
|
85
|
+
p.set_input(s)
|
86
|
+
|
87
|
+
# parse token by token
|
88
|
+
loop do
|
89
|
+
t = p.read
|
90
|
+
break if t == EDNT::EOF
|
91
|
+
|
92
|
+
pp t
|
93
|
+
end
|
52
94
|
```
|
53
95
|
|
96
|
+
|
54
97
|
Known problems
|
55
98
|
==============
|
56
|
-
v0.
|
99
|
+
v0.3.0:
|
57
100
|
|
58
|
-
-
|
101
|
+
- No checks for valid characters in #uuid or #inst are performed by
|
102
|
+
the parser. However, DateTime will throw an error if the date can't
|
103
|
+
be parsed and this is reported.
|
data/ext/edn_turbo/edn_parser.cc
CHANGED
@@ -3,11 +3,7 @@
|
|
3
3
|
#include <iostream>
|
4
4
|
#include <string>
|
5
5
|
#include <stack>
|
6
|
-
|
7
|
-
#include <rice/Hash.hpp>
|
8
|
-
#include <rice/Array.hpp>
|
9
|
-
#include <rice/to_from_ruby.hpp>
|
10
|
-
#include <rice/Exception.hpp>
|
6
|
+
#include <exception>
|
11
7
|
|
12
8
|
#include "edn_parser.h"
|
13
9
|
|
@@ -20,7 +16,7 @@
|
|
20
16
|
//
|
21
17
|
|
22
18
|
|
23
|
-
#line
|
19
|
+
#line 58 "edn_parser.rl"
|
24
20
|
|
25
21
|
|
26
22
|
// ============================================================
|
@@ -28,7 +24,7 @@
|
|
28
24
|
//
|
29
25
|
|
30
26
|
|
31
|
-
#line
|
27
|
+
#line 28 "edn_parser.cc"
|
32
28
|
static const int EDN_value_start = 1;
|
33
29
|
static const int EDN_value_first_final = 2;
|
34
30
|
static const int EDN_value_error = 0;
|
@@ -36,23 +32,23 @@ static const int EDN_value_error = 0;
|
|
36
32
|
static const int EDN_value_en_main = 1;
|
37
33
|
|
38
34
|
|
39
|
-
#line
|
35
|
+
#line 167 "edn_parser.rl"
|
40
36
|
|
41
37
|
|
42
38
|
|
43
|
-
const char *edn::Parser::parse_value(const char *p, const char *pe,
|
39
|
+
const char *edn::Parser::parse_value(const char *p, const char *pe, VALUE& v)
|
44
40
|
{
|
45
41
|
int cs;
|
46
42
|
|
47
43
|
|
48
|
-
#line
|
44
|
+
#line 45 "edn_parser.cc"
|
49
45
|
{
|
50
46
|
cs = EDN_value_start;
|
51
47
|
}
|
52
48
|
|
53
|
-
#line
|
49
|
+
#line 175 "edn_parser.rl"
|
54
50
|
|
55
|
-
#line
|
51
|
+
#line 52 "edn_parser.cc"
|
56
52
|
{
|
57
53
|
if ( p == pe )
|
58
54
|
goto _test_eof;
|
@@ -94,46 +90,46 @@ st0:
|
|
94
90
|
cs = 0;
|
95
91
|
goto _out;
|
96
92
|
tr0:
|
97
|
-
#line
|
93
|
+
#line 102 "edn_parser.rl"
|
98
94
|
{
|
99
95
|
// stand-alone operators *, +, -, etc.
|
100
|
-
const char *np = parse_operator(p, pe,
|
96
|
+
const char *np = parse_operator(p, pe, v);
|
101
97
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
102
98
|
}
|
103
99
|
goto st2;
|
104
100
|
tr2:
|
105
|
-
#line
|
101
|
+
#line 70 "edn_parser.rl"
|
106
102
|
{
|
107
103
|
// string types within double-quotes
|
108
|
-
const char *np = parse_string(p, pe,
|
104
|
+
const char *np = parse_string(p, pe, v);
|
109
105
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
110
106
|
}
|
111
107
|
goto st2;
|
112
108
|
tr3:
|
113
|
-
#line
|
109
|
+
#line 148 "edn_parser.rl"
|
114
110
|
{
|
115
111
|
// handles tokens w/ leading # ("#_", "#{", and tagged elems)
|
116
|
-
const char *np = parse_dispatch(p + 1, pe,
|
112
|
+
const char *np = parse_dispatch(p + 1, pe, v);
|
117
113
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
118
114
|
}
|
119
115
|
goto st2;
|
120
116
|
tr4:
|
121
|
-
#line
|
117
|
+
#line 136 "edn_parser.rl"
|
122
118
|
{
|
123
119
|
// (
|
124
|
-
const char *np = parse_list(p, pe,
|
120
|
+
const char *np = parse_list(p, pe, v);
|
125
121
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
126
122
|
}
|
127
123
|
goto st2;
|
128
124
|
tr5:
|
129
|
-
#line
|
125
|
+
#line 82 "edn_parser.rl"
|
130
126
|
{
|
131
127
|
// tokens w/ leading digits: non-negative integers & decimals.
|
132
128
|
// try to parse a decimal first
|
133
|
-
const char *np = parse_decimal(p, pe,
|
129
|
+
const char *np = parse_decimal(p, pe, v);
|
134
130
|
if (np == NULL) {
|
135
131
|
// if we can't, try to parse it as an int
|
136
|
-
np = parse_integer(p, pe,
|
132
|
+
np = parse_integer(p, pe, v);
|
137
133
|
}
|
138
134
|
|
139
135
|
if (np) {
|
@@ -148,51 +144,52 @@ tr5:
|
|
148
144
|
}
|
149
145
|
goto st2;
|
150
146
|
tr6:
|
151
|
-
#line
|
147
|
+
#line 76 "edn_parser.rl"
|
152
148
|
{
|
153
149
|
// tokens with a leading ':'
|
154
|
-
const char *np = parse_keyword(p, pe,
|
150
|
+
const char *np = parse_keyword(p, pe, v);
|
155
151
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
156
152
|
}
|
157
153
|
goto st2;
|
158
154
|
tr7:
|
159
|
-
#line
|
155
|
+
#line 114 "edn_parser.rl"
|
160
156
|
{
|
161
157
|
// user identifiers and reserved keywords (true, false, nil)
|
162
|
-
|
158
|
+
VALUE sym = Qnil;
|
163
159
|
const char *np = parse_symbol(p, pe, sym);
|
164
160
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {
|
165
|
-
|
166
|
-
|
167
|
-
else if (sym
|
161
|
+
// parse_symbol will make 'sym' a ruby string
|
162
|
+
if (std::strcmp(RSTRING_PTR(sym), "true") == 0) { v = Qtrue; }
|
163
|
+
else if (std::strcmp(RSTRING_PTR(sym), "false") == 0) { v = Qfalse; }
|
164
|
+
else if (std::strcmp(RSTRING_PTR(sym), "nil") == 0) { v = Qnil; }
|
168
165
|
else {
|
169
|
-
|
166
|
+
v = Parser::make_edn_symbol(sym);
|
170
167
|
}
|
171
168
|
{p = (( np))-1;}
|
172
169
|
}
|
173
170
|
}
|
174
171
|
goto st2;
|
175
172
|
tr8:
|
176
|
-
#line
|
173
|
+
#line 130 "edn_parser.rl"
|
177
174
|
{
|
178
175
|
// [
|
179
|
-
const char *np = parse_vector(p, pe,
|
176
|
+
const char *np = parse_vector(p, pe, v);
|
180
177
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
181
178
|
}
|
182
179
|
goto st2;
|
183
180
|
tr9:
|
184
|
-
#line
|
181
|
+
#line 108 "edn_parser.rl"
|
185
182
|
{
|
186
183
|
// tokens w/ leading \ (escaped characters \newline, \c, etc.)
|
187
|
-
const char *np = parse_esc_char(p, pe,
|
184
|
+
const char *np = parse_esc_char(p, pe, v);
|
188
185
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
189
186
|
}
|
190
187
|
goto st2;
|
191
188
|
tr10:
|
192
|
-
#line
|
189
|
+
#line 142 "edn_parser.rl"
|
193
190
|
{
|
194
191
|
// {
|
195
|
-
const char *np = parse_map(p, pe,
|
192
|
+
const char *np = parse_map(p, pe, v);
|
196
193
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
197
194
|
}
|
198
195
|
goto st2;
|
@@ -200,9 +197,9 @@ st2:
|
|
200
197
|
if ( ++p == pe )
|
201
198
|
goto _test_eof2;
|
202
199
|
case 2:
|
203
|
-
#line
|
200
|
+
#line 57 "edn_parser.rl"
|
204
201
|
{ p--; {p++; cs = 2; goto _out;} }
|
205
|
-
#line
|
202
|
+
#line 203 "edn_parser.cc"
|
206
203
|
goto st0;
|
207
204
|
}
|
208
205
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -211,7 +208,7 @@ case 2:
|
|
211
208
|
_out: {}
|
212
209
|
}
|
213
210
|
|
214
|
-
#line
|
211
|
+
#line 176 "edn_parser.rl"
|
215
212
|
|
216
213
|
if (cs >= EDN_value_first_final) {
|
217
214
|
return p;
|
@@ -233,7 +230,7 @@ case 2:
|
|
233
230
|
// ascii range is found.
|
234
231
|
//
|
235
232
|
|
236
|
-
#line
|
233
|
+
#line 234 "edn_parser.cc"
|
237
234
|
static const int EDN_string_start = 1;
|
238
235
|
static const int EDN_string_first_final = 8;
|
239
236
|
static const int EDN_string_error = 0;
|
@@ -241,29 +238,27 @@ static const int EDN_string_error = 0;
|
|
241
238
|
static const int EDN_string_en_main = 1;
|
242
239
|
|
243
240
|
|
244
|
-
#line
|
241
|
+
#line 221 "edn_parser.rl"
|
245
242
|
|
246
243
|
|
247
244
|
|
248
|
-
const char* edn::Parser::parse_string(const char *p, const char *pe,
|
245
|
+
const char* edn::Parser::parse_string(const char *p, const char *pe, VALUE& v)
|
249
246
|
{
|
250
247
|
// std::cerr << __FUNCTION__ << " - p: '" << p << "'" << std::endl;
|
251
248
|
static const char* EDN_TYPE = "string";
|
252
249
|
int cs;
|
253
250
|
bool encode = false;
|
254
|
-
const char *eof = pe;
|
255
|
-
Rice::String s;
|
256
251
|
|
257
252
|
|
258
|
-
#line
|
253
|
+
#line 254 "edn_parser.cc"
|
259
254
|
{
|
260
255
|
cs = EDN_string_start;
|
261
256
|
}
|
262
257
|
|
263
|
-
#line
|
264
|
-
p_save = p;
|
258
|
+
#line 232 "edn_parser.rl"
|
259
|
+
const char* p_save = p;
|
265
260
|
|
266
|
-
#line
|
261
|
+
#line 262 "edn_parser.cc"
|
267
262
|
{
|
268
263
|
if ( p == pe )
|
269
264
|
goto _test_eof;
|
@@ -274,7 +269,7 @@ case 1:
|
|
274
269
|
goto st2;
|
275
270
|
goto st0;
|
276
271
|
tr3:
|
277
|
-
#line
|
272
|
+
#line 50 "edn_parser.rl"
|
278
273
|
{
|
279
274
|
std::stringstream s;
|
280
275
|
s << "unterminated " << EDN_TYPE;
|
@@ -282,12 +277,12 @@ tr3:
|
|
282
277
|
p--; {p++; cs = 0; goto _out;}
|
283
278
|
}
|
284
279
|
goto st0;
|
285
|
-
#line
|
280
|
+
#line 281 "edn_parser.cc"
|
286
281
|
st0:
|
287
282
|
cs = 0;
|
288
283
|
goto _out;
|
289
284
|
tr2:
|
290
|
-
#line
|
285
|
+
#line 210 "edn_parser.rl"
|
291
286
|
{
|
292
287
|
encode = true;
|
293
288
|
}
|
@@ -296,7 +291,7 @@ st2:
|
|
296
291
|
if ( ++p == pe )
|
297
292
|
goto _test_eof2;
|
298
293
|
case 2:
|
299
|
-
#line
|
294
|
+
#line 295 "edn_parser.cc"
|
300
295
|
switch( (*p) ) {
|
301
296
|
case 34: goto tr4;
|
302
297
|
case 92: goto tr5;
|
@@ -308,25 +303,25 @@ case 2:
|
|
308
303
|
goto tr2;
|
309
304
|
goto st2;
|
310
305
|
tr4:
|
311
|
-
#line
|
306
|
+
#line 202 "edn_parser.rl"
|
312
307
|
{
|
313
|
-
if (Parser::parse_byte_stream(p_save + 1, p,
|
308
|
+
if (Parser::parse_byte_stream(p_save + 1, p, v, encode)) {
|
314
309
|
{p = (( p + 1))-1;}
|
315
310
|
} else {
|
316
311
|
p--; {p++; cs = 8; goto _out;}
|
317
312
|
}
|
318
313
|
}
|
319
|
-
#line
|
314
|
+
#line 57 "edn_parser.rl"
|
320
315
|
{ p--; {p++; cs = 8; goto _out;} }
|
321
316
|
goto st8;
|
322
317
|
st8:
|
323
318
|
if ( ++p == pe )
|
324
319
|
goto _test_eof8;
|
325
320
|
case 8:
|
326
|
-
#line
|
321
|
+
#line 322 "edn_parser.cc"
|
327
322
|
goto st0;
|
328
323
|
tr5:
|
329
|
-
#line
|
324
|
+
#line 210 "edn_parser.rl"
|
330
325
|
{
|
331
326
|
encode = true;
|
332
327
|
}
|
@@ -335,7 +330,7 @@ st3:
|
|
335
330
|
if ( ++p == pe )
|
336
331
|
goto _test_eof3;
|
337
332
|
case 3:
|
338
|
-
#line
|
333
|
+
#line 334 "edn_parser.cc"
|
339
334
|
switch( (*p) ) {
|
340
335
|
case 34: goto tr2;
|
341
336
|
case 47: goto tr2;
|
@@ -351,7 +346,7 @@ case 3:
|
|
351
346
|
goto st0;
|
352
347
|
goto st2;
|
353
348
|
tr6:
|
354
|
-
#line
|
349
|
+
#line 210 "edn_parser.rl"
|
355
350
|
{
|
356
351
|
encode = true;
|
357
352
|
}
|
@@ -360,7 +355,7 @@ st4:
|
|
360
355
|
if ( ++p == pe )
|
361
356
|
goto _test_eof4;
|
362
357
|
case 4:
|
363
|
-
#line
|
358
|
+
#line 359 "edn_parser.cc"
|
364
359
|
if ( (*p) < 65 ) {
|
365
360
|
if ( 48 <= (*p) && (*p) <= 57 )
|
366
361
|
goto tr7;
|
@@ -371,7 +366,7 @@ case 4:
|
|
371
366
|
goto tr7;
|
372
367
|
goto st0;
|
373
368
|
tr7:
|
374
|
-
#line
|
369
|
+
#line 210 "edn_parser.rl"
|
375
370
|
{
|
376
371
|
encode = true;
|
377
372
|
}
|
@@ -380,7 +375,7 @@ st5:
|
|
380
375
|
if ( ++p == pe )
|
381
376
|
goto _test_eof5;
|
382
377
|
case 5:
|
383
|
-
#line
|
378
|
+
#line 379 "edn_parser.cc"
|
384
379
|
if ( (*p) < 65 ) {
|
385
380
|
if ( 48 <= (*p) && (*p) <= 57 )
|
386
381
|
goto tr8;
|
@@ -391,7 +386,7 @@ case 5:
|
|
391
386
|
goto tr8;
|
392
387
|
goto st0;
|
393
388
|
tr8:
|
394
|
-
#line
|
389
|
+
#line 210 "edn_parser.rl"
|
395
390
|
{
|
396
391
|
encode = true;
|
397
392
|
}
|
@@ -400,7 +395,7 @@ st6:
|
|
400
395
|
if ( ++p == pe )
|
401
396
|
goto _test_eof6;
|
402
397
|
case 6:
|
403
|
-
#line
|
398
|
+
#line 399 "edn_parser.cc"
|
404
399
|
if ( (*p) < 65 ) {
|
405
400
|
if ( 48 <= (*p) && (*p) <= 57 )
|
406
401
|
goto tr9;
|
@@ -411,7 +406,7 @@ case 6:
|
|
411
406
|
goto tr9;
|
412
407
|
goto st0;
|
413
408
|
tr9:
|
414
|
-
#line
|
409
|
+
#line 210 "edn_parser.rl"
|
415
410
|
{
|
416
411
|
encode = true;
|
417
412
|
}
|
@@ -420,7 +415,7 @@ st7:
|
|
420
415
|
if ( ++p == pe )
|
421
416
|
goto _test_eof7;
|
422
417
|
case 7:
|
423
|
-
#line
|
418
|
+
#line 419 "edn_parser.cc"
|
424
419
|
if ( (*p) < 65 ) {
|
425
420
|
if ( 48 <= (*p) && (*p) <= 57 )
|
426
421
|
goto tr2;
|
@@ -444,7 +439,7 @@ case 7:
|
|
444
439
|
{
|
445
440
|
switch ( cs ) {
|
446
441
|
case 2:
|
447
|
-
#line
|
442
|
+
#line 50 "edn_parser.rl"
|
448
443
|
{
|
449
444
|
std::stringstream s;
|
450
445
|
s << "unterminated " << EDN_TYPE;
|
@@ -452,17 +447,16 @@ case 7:
|
|
452
447
|
p--; {p++; cs = 0; goto _out;}
|
453
448
|
}
|
454
449
|
break;
|
455
|
-
#line
|
450
|
+
#line 451 "edn_parser.cc"
|
456
451
|
}
|
457
452
|
}
|
458
453
|
|
459
454
|
_out: {}
|
460
455
|
}
|
461
456
|
|
462
|
-
#line
|
457
|
+
#line 234 "edn_parser.rl"
|
463
458
|
|
464
459
|
if (cs >= EDN_string_first_final) {
|
465
|
-
o = s;
|
466
460
|
return p + 1;
|
467
461
|
}
|
468
462
|
else if (cs == EDN_string_error) {
|
@@ -478,7 +472,7 @@ case 7:
|
|
478
472
|
// keyword parsing
|
479
473
|
//
|
480
474
|
|
481
|
-
#line
|
475
|
+
#line 476 "edn_parser.cc"
|
482
476
|
static const int EDN_keyword_start = 1;
|
483
477
|
static const int EDN_keyword_first_final = 3;
|
484
478
|
static const int EDN_keyword_error = 0;
|
@@ -486,24 +480,24 @@ static const int EDN_keyword_error = 0;
|
|
486
480
|
static const int EDN_keyword_en_main = 1;
|
487
481
|
|
488
482
|
|
489
|
-
#line
|
483
|
+
#line 263 "edn_parser.rl"
|
490
484
|
|
491
485
|
|
492
486
|
|
493
|
-
const char* edn::Parser::parse_keyword(const char *p, const char *pe,
|
487
|
+
const char* edn::Parser::parse_keyword(const char *p, const char *pe, VALUE& v)
|
494
488
|
{
|
495
489
|
int cs;
|
496
490
|
|
497
491
|
|
498
|
-
#line
|
492
|
+
#line 493 "edn_parser.cc"
|
499
493
|
{
|
500
494
|
cs = EDN_keyword_start;
|
501
495
|
}
|
502
496
|
|
503
|
-
#line
|
504
|
-
p_save = p;
|
497
|
+
#line 271 "edn_parser.rl"
|
498
|
+
const char* p_save = p;
|
505
499
|
|
506
|
-
#line
|
500
|
+
#line 501 "edn_parser.cc"
|
507
501
|
{
|
508
502
|
if ( p == pe )
|
509
503
|
goto _test_eof;
|
@@ -558,14 +552,14 @@ case 3:
|
|
558
552
|
goto st3;
|
559
553
|
goto tr3;
|
560
554
|
tr3:
|
561
|
-
#line
|
555
|
+
#line 57 "edn_parser.rl"
|
562
556
|
{ p--; {p++; cs = 4; goto _out;} }
|
563
557
|
goto st4;
|
564
558
|
st4:
|
565
559
|
if ( ++p == pe )
|
566
560
|
goto _test_eof4;
|
567
561
|
case 4:
|
568
|
-
#line
|
562
|
+
#line 563 "edn_parser.cc"
|
569
563
|
goto st0;
|
570
564
|
}
|
571
565
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -576,14 +570,14 @@ case 4:
|
|
576
570
|
_out: {}
|
577
571
|
}
|
578
572
|
|
579
|
-
#line
|
573
|
+
#line 273 "edn_parser.rl"
|
580
574
|
|
581
575
|
if (cs >= EDN_keyword_first_final) {
|
582
576
|
std::string buf;
|
583
577
|
uint32_t len = p - p_save;
|
584
|
-
// don't include leading ':' because
|
578
|
+
// don't include leading ':' because the ruby symbol will handle it
|
585
579
|
buf.append(p_save + 1, len - 1);
|
586
|
-
|
580
|
+
v = ID2SYM(rb_intern(buf.c_str()));
|
587
581
|
return p;
|
588
582
|
}
|
589
583
|
else if (cs == EDN_keyword_error) {
|
@@ -600,31 +594,31 @@ case 4:
|
|
600
594
|
// decimal parsing machine
|
601
595
|
//
|
602
596
|
|
603
|
-
#line
|
597
|
+
#line 598 "edn_parser.cc"
|
604
598
|
static const int EDN_decimal_start = 1;
|
605
599
|
static const int EDN_decimal_first_final = 9;
|
606
600
|
|
607
601
|
static const int EDN_decimal_en_main = 1;
|
608
602
|
|
609
603
|
|
610
|
-
#line
|
604
|
+
#line 306 "edn_parser.rl"
|
611
605
|
|
612
606
|
|
613
607
|
|
614
|
-
const char* edn::Parser::parse_decimal(const char *p, const char *pe,
|
608
|
+
const char* edn::Parser::parse_decimal(const char *p, const char *pe, VALUE& v)
|
615
609
|
{
|
616
610
|
int cs;
|
617
611
|
|
618
612
|
|
619
|
-
#line
|
613
|
+
#line 614 "edn_parser.cc"
|
620
614
|
{
|
621
615
|
cs = EDN_decimal_start;
|
622
616
|
}
|
623
617
|
|
624
|
-
#line
|
625
|
-
p_save = p;
|
618
|
+
#line 314 "edn_parser.rl"
|
619
|
+
const char* p_save = p;
|
626
620
|
|
627
|
-
#line
|
621
|
+
#line 622 "edn_parser.cc"
|
628
622
|
{
|
629
623
|
if ( p == pe )
|
630
624
|
goto _test_eof;
|
@@ -678,14 +672,14 @@ case 9:
|
|
678
672
|
goto st0;
|
679
673
|
goto tr10;
|
680
674
|
tr10:
|
681
|
-
#line
|
675
|
+
#line 57 "edn_parser.rl"
|
682
676
|
{ p--; {p++; cs = 10; goto _out;} }
|
683
677
|
goto st10;
|
684
678
|
st10:
|
685
679
|
if ( ++p == pe )
|
686
680
|
goto _test_eof10;
|
687
681
|
case 10:
|
688
|
-
#line
|
682
|
+
#line 683 "edn_parser.cc"
|
689
683
|
goto st0;
|
690
684
|
st4:
|
691
685
|
if ( ++p == pe )
|
@@ -801,10 +795,10 @@ case 8:
|
|
801
795
|
_out: {}
|
802
796
|
}
|
803
797
|
|
804
|
-
#line
|
798
|
+
#line 316 "edn_parser.rl"
|
805
799
|
|
806
800
|
if (cs >= EDN_decimal_first_final) {
|
807
|
-
|
801
|
+
v = Parser::float_to_ruby(p_save, p - p_save);
|
808
802
|
return p + 1;
|
809
803
|
}
|
810
804
|
else if (cs == EDN_decimal_en_main) {} // silence ragel warning
|
@@ -816,30 +810,30 @@ case 8:
|
|
816
810
|
// integer parsing machine
|
817
811
|
//
|
818
812
|
|
819
|
-
#line
|
813
|
+
#line 814 "edn_parser.cc"
|
820
814
|
static const int EDN_integer_start = 1;
|
821
815
|
static const int EDN_integer_first_final = 3;
|
822
816
|
|
823
817
|
static const int EDN_integer_en_main = 1;
|
824
818
|
|
825
819
|
|
826
|
-
#line
|
820
|
+
#line 339 "edn_parser.rl"
|
827
821
|
|
828
822
|
|
829
|
-
const char* edn::Parser::parse_integer(const char *p, const char *pe,
|
823
|
+
const char* edn::Parser::parse_integer(const char *p, const char *pe, VALUE& v)
|
830
824
|
{
|
831
825
|
int cs;
|
832
826
|
|
833
827
|
|
834
|
-
#line
|
828
|
+
#line 829 "edn_parser.cc"
|
835
829
|
{
|
836
830
|
cs = EDN_integer_start;
|
837
831
|
}
|
838
832
|
|
839
|
-
#line
|
840
|
-
p_save = p;
|
833
|
+
#line 346 "edn_parser.rl"
|
834
|
+
const char* p_save = p;
|
841
835
|
|
842
|
-
#line
|
836
|
+
#line 837 "edn_parser.cc"
|
843
837
|
{
|
844
838
|
if ( p == pe )
|
845
839
|
goto _test_eof;
|
@@ -881,14 +875,14 @@ case 3:
|
|
881
875
|
goto st0;
|
882
876
|
goto tr4;
|
883
877
|
tr4:
|
884
|
-
#line
|
878
|
+
#line 57 "edn_parser.rl"
|
885
879
|
{ p--; {p++; cs = 4; goto _out;} }
|
886
880
|
goto st4;
|
887
881
|
st4:
|
888
882
|
if ( ++p == pe )
|
889
883
|
goto _test_eof4;
|
890
884
|
case 4:
|
891
|
-
#line
|
885
|
+
#line 886 "edn_parser.cc"
|
892
886
|
goto st0;
|
893
887
|
st5:
|
894
888
|
if ( ++p == pe )
|
@@ -929,10 +923,10 @@ case 6:
|
|
929
923
|
_out: {}
|
930
924
|
}
|
931
925
|
|
932
|
-
#line
|
926
|
+
#line 348 "edn_parser.rl"
|
933
927
|
|
934
928
|
if (cs >= EDN_integer_first_final) {
|
935
|
-
|
929
|
+
v = Parser::integer_to_ruby(p_save, p - p_save);
|
936
930
|
return p + 1;
|
937
931
|
}
|
938
932
|
else if (cs == EDN_integer_en_main) {} // silence ragel warning
|
@@ -949,7 +943,7 @@ case 6:
|
|
949
943
|
// 3. stand-alone operators: +, -, /, *, etc.
|
950
944
|
//
|
951
945
|
|
952
|
-
#line
|
946
|
+
#line 947 "edn_parser.cc"
|
953
947
|
static const int EDN_operator_start = 1;
|
954
948
|
static const int EDN_operator_first_final = 3;
|
955
949
|
static const int EDN_operator_error = 0;
|
@@ -957,24 +951,24 @@ static const int EDN_operator_error = 0;
|
|
957
951
|
static const int EDN_operator_en_main = 1;
|
958
952
|
|
959
953
|
|
960
|
-
#line
|
954
|
+
#line 418 "edn_parser.rl"
|
961
955
|
|
962
956
|
|
963
957
|
|
964
|
-
const char* edn::Parser::parse_operator(const char *p, const char *pe,
|
958
|
+
const char* edn::Parser::parse_operator(const char *p, const char *pe, VALUE& v)
|
965
959
|
{
|
966
960
|
int cs;
|
967
961
|
|
968
962
|
|
969
|
-
#line
|
963
|
+
#line 964 "edn_parser.cc"
|
970
964
|
{
|
971
965
|
cs = EDN_operator_start;
|
972
966
|
}
|
973
967
|
|
974
|
-
#line
|
975
|
-
p_save = p;
|
968
|
+
#line 426 "edn_parser.rl"
|
969
|
+
const char* p_save = p;
|
976
970
|
|
977
|
-
#line
|
971
|
+
#line 972 "edn_parser.cc"
|
978
972
|
{
|
979
973
|
if ( p == pe )
|
980
974
|
goto _test_eof;
|
@@ -1030,69 +1024,69 @@ case 3:
|
|
1030
1024
|
goto st0;
|
1031
1025
|
goto tr6;
|
1032
1026
|
tr6:
|
1033
|
-
#line
|
1027
|
+
#line 405 "edn_parser.rl"
|
1034
1028
|
{
|
1035
1029
|
// stand-alone operators (-, +, /, ... etc)
|
1036
|
-
|
1037
|
-
sym
|
1038
|
-
|
1030
|
+
char op[2] = { *p_save, 0 };
|
1031
|
+
VALUE sym = rb_str_new2(op);
|
1032
|
+
v = Parser::make_edn_symbol(sym);
|
1039
1033
|
}
|
1040
|
-
#line
|
1034
|
+
#line 57 "edn_parser.rl"
|
1041
1035
|
{ p--; {p++; cs = 4; goto _out;} }
|
1042
1036
|
goto st4;
|
1043
1037
|
tr10:
|
1044
|
-
#line
|
1038
|
+
#line 57 "edn_parser.rl"
|
1045
1039
|
{ p--; {p++; cs = 4; goto _out;} }
|
1046
1040
|
goto st4;
|
1047
1041
|
st4:
|
1048
1042
|
if ( ++p == pe )
|
1049
1043
|
goto _test_eof4;
|
1050
1044
|
case 4:
|
1051
|
-
#line
|
1045
|
+
#line 1046 "edn_parser.cc"
|
1052
1046
|
goto st0;
|
1053
1047
|
tr5:
|
1054
|
-
#line
|
1048
|
+
#line 20 "edn_parser.rl"
|
1055
1049
|
{ line_number++; }
|
1056
1050
|
goto st5;
|
1057
1051
|
tr7:
|
1058
|
-
#line
|
1052
|
+
#line 405 "edn_parser.rl"
|
1059
1053
|
{
|
1060
1054
|
// stand-alone operators (-, +, /, ... etc)
|
1061
|
-
|
1062
|
-
sym
|
1063
|
-
|
1055
|
+
char op[2] = { *p_save, 0 };
|
1056
|
+
VALUE sym = rb_str_new2(op);
|
1057
|
+
v = Parser::make_edn_symbol(sym);
|
1064
1058
|
}
|
1065
|
-
#line
|
1059
|
+
#line 57 "edn_parser.rl"
|
1066
1060
|
{ p--; {p++; cs = 5; goto _out;} }
|
1067
1061
|
goto st5;
|
1068
1062
|
tr8:
|
1069
|
-
#line
|
1063
|
+
#line 405 "edn_parser.rl"
|
1070
1064
|
{
|
1071
1065
|
// stand-alone operators (-, +, /, ... etc)
|
1072
|
-
|
1073
|
-
sym
|
1074
|
-
|
1066
|
+
char op[2] = { *p_save, 0 };
|
1067
|
+
VALUE sym = rb_str_new2(op);
|
1068
|
+
v = Parser::make_edn_symbol(sym);
|
1075
1069
|
}
|
1076
|
-
#line
|
1070
|
+
#line 20 "edn_parser.rl"
|
1077
1071
|
{ line_number++; }
|
1078
|
-
#line
|
1072
|
+
#line 57 "edn_parser.rl"
|
1079
1073
|
{ p--; {p++; cs = 5; goto _out;} }
|
1080
1074
|
goto st5;
|
1081
1075
|
tr11:
|
1082
|
-
#line
|
1076
|
+
#line 57 "edn_parser.rl"
|
1083
1077
|
{ p--; {p++; cs = 5; goto _out;} }
|
1084
1078
|
goto st5;
|
1085
1079
|
tr12:
|
1086
|
-
#line
|
1080
|
+
#line 20 "edn_parser.rl"
|
1087
1081
|
{ line_number++; }
|
1088
|
-
#line
|
1082
|
+
#line 57 "edn_parser.rl"
|
1089
1083
|
{ p--; {p++; cs = 5; goto _out;} }
|
1090
1084
|
goto st5;
|
1091
1085
|
st5:
|
1092
1086
|
if ( ++p == pe )
|
1093
1087
|
goto _test_eof5;
|
1094
1088
|
case 5:
|
1095
|
-
#line
|
1089
|
+
#line 1090 "edn_parser.cc"
|
1096
1090
|
switch( (*p) ) {
|
1097
1091
|
case 10: goto tr12;
|
1098
1092
|
case 32: goto tr11;
|
@@ -1120,25 +1114,25 @@ case 5:
|
|
1120
1114
|
goto st0;
|
1121
1115
|
goto tr10;
|
1122
1116
|
tr9:
|
1123
|
-
#line
|
1117
|
+
#line 405 "edn_parser.rl"
|
1124
1118
|
{
|
1125
1119
|
// stand-alone operators (-, +, /, ... etc)
|
1126
|
-
|
1127
|
-
sym
|
1128
|
-
|
1120
|
+
char op[2] = { *p_save, 0 };
|
1121
|
+
VALUE sym = rb_str_new2(op);
|
1122
|
+
v = Parser::make_edn_symbol(sym);
|
1129
1123
|
}
|
1130
|
-
#line
|
1124
|
+
#line 57 "edn_parser.rl"
|
1131
1125
|
{ p--; {p++; cs = 6; goto _out;} }
|
1132
1126
|
goto st6;
|
1133
1127
|
tr13:
|
1134
|
-
#line
|
1128
|
+
#line 57 "edn_parser.rl"
|
1135
1129
|
{ p--; {p++; cs = 6; goto _out;} }
|
1136
1130
|
goto st6;
|
1137
1131
|
st6:
|
1138
1132
|
if ( ++p == pe )
|
1139
1133
|
goto _test_eof6;
|
1140
1134
|
case 6:
|
1141
|
-
#line
|
1135
|
+
#line 1136 "edn_parser.cc"
|
1142
1136
|
if ( (*p) == 10 )
|
1143
1137
|
goto tr5;
|
1144
1138
|
goto st2;
|
@@ -1183,17 +1177,17 @@ case 7:
|
|
1183
1177
|
goto tr14;
|
1184
1178
|
goto tr6;
|
1185
1179
|
tr14:
|
1186
|
-
#line
|
1180
|
+
#line 382 "edn_parser.rl"
|
1187
1181
|
{
|
1188
1182
|
// parse a number with the leading symbol - this is slightly
|
1189
1183
|
// different than the one within EDN_value since it includes
|
1190
1184
|
// the leading - or +
|
1191
1185
|
//
|
1192
1186
|
// try to parse a decimal first
|
1193
|
-
const char *np = parse_decimal(p_save, pe,
|
1187
|
+
const char *np = parse_decimal(p_save, pe, v);
|
1194
1188
|
if (np == NULL) {
|
1195
1189
|
// if we can't, try to parse it as an int
|
1196
|
-
np = parse_integer(p_save, pe,
|
1190
|
+
np = parse_integer(p_save, pe, v);
|
1197
1191
|
}
|
1198
1192
|
|
1199
1193
|
if (np) {
|
@@ -1208,13 +1202,13 @@ tr14:
|
|
1208
1202
|
}
|
1209
1203
|
goto st8;
|
1210
1204
|
tr15:
|
1211
|
-
#line
|
1205
|
+
#line 372 "edn_parser.rl"
|
1212
1206
|
{
|
1213
1207
|
// parse a symbol including the leading operator (-, +, .)
|
1214
|
-
|
1208
|
+
VALUE sym = Qnil;
|
1215
1209
|
const char *np = parse_symbol(p_save, pe, sym);
|
1216
1210
|
if (np == NULL) { p--; {p++; cs = 8; goto _out;} } else {
|
1217
|
-
|
1211
|
+
v = Parser::make_edn_symbol(sym);
|
1218
1212
|
{p = (( np))-1;}
|
1219
1213
|
}
|
1220
1214
|
}
|
@@ -1223,7 +1217,7 @@ st8:
|
|
1223
1217
|
if ( ++p == pe )
|
1224
1218
|
goto _test_eof8;
|
1225
1219
|
case 8:
|
1226
|
-
#line
|
1220
|
+
#line 1221 "edn_parser.cc"
|
1227
1221
|
switch( (*p) ) {
|
1228
1222
|
case 33: goto st0;
|
1229
1223
|
case 95: goto st0;
|
@@ -1293,22 +1287,22 @@ case 9:
|
|
1293
1287
|
case 3:
|
1294
1288
|
case 7:
|
1295
1289
|
case 9:
|
1296
|
-
#line
|
1290
|
+
#line 405 "edn_parser.rl"
|
1297
1291
|
{
|
1298
1292
|
// stand-alone operators (-, +, /, ... etc)
|
1299
|
-
|
1300
|
-
sym
|
1301
|
-
|
1293
|
+
char op[2] = { *p_save, 0 };
|
1294
|
+
VALUE sym = rb_str_new2(op);
|
1295
|
+
v = Parser::make_edn_symbol(sym);
|
1302
1296
|
}
|
1303
1297
|
break;
|
1304
|
-
#line
|
1298
|
+
#line 1299 "edn_parser.cc"
|
1305
1299
|
}
|
1306
1300
|
}
|
1307
1301
|
|
1308
1302
|
_out: {}
|
1309
1303
|
}
|
1310
1304
|
|
1311
|
-
#line
|
1305
|
+
#line 428 "edn_parser.rl"
|
1312
1306
|
|
1313
1307
|
if (cs >= EDN_operator_first_final) {
|
1314
1308
|
return p;
|
@@ -1327,7 +1321,7 @@ case 9:
|
|
1327
1321
|
// escaped char parsing - handles \c, \newline, \formfeed, etc.
|
1328
1322
|
//
|
1329
1323
|
|
1330
|
-
#line
|
1324
|
+
#line 1325 "edn_parser.cc"
|
1331
1325
|
static const int EDN_escaped_char_start = 1;
|
1332
1326
|
static const int EDN_escaped_char_first_final = 4;
|
1333
1327
|
static const int EDN_escaped_char_error = 0;
|
@@ -1335,24 +1329,24 @@ static const int EDN_escaped_char_error = 0;
|
|
1335
1329
|
static const int EDN_escaped_char_en_main = 1;
|
1336
1330
|
|
1337
1331
|
|
1338
|
-
#line
|
1332
|
+
#line 457 "edn_parser.rl"
|
1339
1333
|
|
1340
1334
|
|
1341
1335
|
|
1342
|
-
const char* edn::Parser::parse_esc_char(const char *p, const char *pe,
|
1336
|
+
const char* edn::Parser::parse_esc_char(const char *p, const char *pe, VALUE& v)
|
1343
1337
|
{
|
1344
1338
|
int cs;
|
1345
1339
|
|
1346
1340
|
|
1347
|
-
#line
|
1341
|
+
#line 1342 "edn_parser.cc"
|
1348
1342
|
{
|
1349
1343
|
cs = EDN_escaped_char_start;
|
1350
1344
|
}
|
1351
1345
|
|
1352
|
-
#line
|
1353
|
-
p_save = p;
|
1346
|
+
#line 465 "edn_parser.rl"
|
1347
|
+
const char* p_save = p;
|
1354
1348
|
|
1355
|
-
#line
|
1349
|
+
#line 1350 "edn_parser.cc"
|
1356
1350
|
{
|
1357
1351
|
if ( p == pe )
|
1358
1352
|
goto _test_eof;
|
@@ -1396,34 +1390,34 @@ case 4:
|
|
1396
1390
|
goto st4;
|
1397
1391
|
goto tr5;
|
1398
1392
|
tr5:
|
1399
|
-
#line
|
1393
|
+
#line 57 "edn_parser.rl"
|
1400
1394
|
{ p--; {p++; cs = 5; goto _out;} }
|
1401
1395
|
goto st5;
|
1402
1396
|
st5:
|
1403
1397
|
if ( ++p == pe )
|
1404
1398
|
goto _test_eof5;
|
1405
1399
|
case 5:
|
1406
|
-
#line
|
1400
|
+
#line 1401 "edn_parser.cc"
|
1407
1401
|
goto st0;
|
1408
1402
|
tr4:
|
1409
|
-
#line
|
1403
|
+
#line 20 "edn_parser.rl"
|
1410
1404
|
{ line_number++; }
|
1411
1405
|
goto st6;
|
1412
1406
|
tr6:
|
1413
|
-
#line
|
1407
|
+
#line 57 "edn_parser.rl"
|
1414
1408
|
{ p--; {p++; cs = 6; goto _out;} }
|
1415
1409
|
goto st6;
|
1416
1410
|
tr7:
|
1417
|
-
#line
|
1411
|
+
#line 20 "edn_parser.rl"
|
1418
1412
|
{ line_number++; }
|
1419
|
-
#line
|
1413
|
+
#line 57 "edn_parser.rl"
|
1420
1414
|
{ p--; {p++; cs = 6; goto _out;} }
|
1421
1415
|
goto st6;
|
1422
1416
|
st6:
|
1423
1417
|
if ( ++p == pe )
|
1424
1418
|
goto _test_eof6;
|
1425
1419
|
case 6:
|
1426
|
-
#line
|
1420
|
+
#line 1421 "edn_parser.cc"
|
1427
1421
|
switch( (*p) ) {
|
1428
1422
|
case 10: goto tr7;
|
1429
1423
|
case 32: goto tr6;
|
@@ -1441,14 +1435,14 @@ case 6:
|
|
1441
1435
|
goto st0;
|
1442
1436
|
goto tr5;
|
1443
1437
|
tr8:
|
1444
|
-
#line
|
1438
|
+
#line 57 "edn_parser.rl"
|
1445
1439
|
{ p--; {p++; cs = 7; goto _out;} }
|
1446
1440
|
goto st7;
|
1447
1441
|
st7:
|
1448
1442
|
if ( ++p == pe )
|
1449
1443
|
goto _test_eof7;
|
1450
1444
|
case 7:
|
1451
|
-
#line
|
1445
|
+
#line 1446 "edn_parser.cc"
|
1452
1446
|
if ( (*p) == 10 )
|
1453
1447
|
goto tr4;
|
1454
1448
|
goto st3;
|
@@ -1471,11 +1465,11 @@ case 3:
|
|
1471
1465
|
_out: {}
|
1472
1466
|
}
|
1473
1467
|
|
1474
|
-
#line
|
1468
|
+
#line 467 "edn_parser.rl"
|
1475
1469
|
|
1476
1470
|
if (cs >= EDN_escaped_char_first_final) {
|
1477
1471
|
// convert the escaped value to a character
|
1478
|
-
if (!Parser::parse_escaped_char(p_save + 1, p,
|
1472
|
+
if (!Parser::parse_escaped_char(p_save + 1, p, v)) {
|
1479
1473
|
return pe;
|
1480
1474
|
}
|
1481
1475
|
return p;
|
@@ -1496,8 +1490,9 @@ case 3:
|
|
1496
1490
|
// character and an optional leading operator (name, -today,
|
1497
1491
|
// .yesterday)
|
1498
1492
|
//
|
1493
|
+
//
|
1499
1494
|
|
1500
|
-
#line
|
1495
|
+
#line 1496 "edn_parser.cc"
|
1501
1496
|
static const int EDN_symbol_start = 1;
|
1502
1497
|
static const int EDN_symbol_first_final = 5;
|
1503
1498
|
static const int EDN_symbol_error = 0;
|
@@ -1505,24 +1500,24 @@ static const int EDN_symbol_error = 0;
|
|
1505
1500
|
static const int EDN_symbol_en_main = 1;
|
1506
1501
|
|
1507
1502
|
|
1508
|
-
#line
|
1503
|
+
#line 502 "edn_parser.rl"
|
1509
1504
|
|
1510
1505
|
|
1511
1506
|
|
1512
|
-
const char* edn::Parser::parse_symbol(const char *p, const char *pe,
|
1507
|
+
const char* edn::Parser::parse_symbol(const char *p, const char *pe, VALUE& s)
|
1513
1508
|
{
|
1514
1509
|
int cs;
|
1515
1510
|
|
1516
1511
|
|
1517
|
-
#line
|
1512
|
+
#line 1513 "edn_parser.cc"
|
1518
1513
|
{
|
1519
1514
|
cs = EDN_symbol_start;
|
1520
1515
|
}
|
1521
1516
|
|
1522
|
-
#line
|
1523
|
-
p_save = p;
|
1517
|
+
#line 510 "edn_parser.rl"
|
1518
|
+
const char* p_save = p;
|
1524
1519
|
|
1525
|
-
#line
|
1520
|
+
#line 1521 "edn_parser.cc"
|
1526
1521
|
{
|
1527
1522
|
if ( p == pe )
|
1528
1523
|
goto _test_eof;
|
@@ -1600,34 +1595,34 @@ case 5:
|
|
1600
1595
|
goto st5;
|
1601
1596
|
goto tr6;
|
1602
1597
|
tr6:
|
1603
|
-
#line
|
1598
|
+
#line 57 "edn_parser.rl"
|
1604
1599
|
{ p--; {p++; cs = 6; goto _out;} }
|
1605
1600
|
goto st6;
|
1606
1601
|
st6:
|
1607
1602
|
if ( ++p == pe )
|
1608
1603
|
goto _test_eof6;
|
1609
1604
|
case 6:
|
1610
|
-
#line
|
1605
|
+
#line 1606 "edn_parser.cc"
|
1611
1606
|
goto st0;
|
1612
1607
|
tr4:
|
1613
|
-
#line
|
1608
|
+
#line 20 "edn_parser.rl"
|
1614
1609
|
{ line_number++; }
|
1615
1610
|
goto st7;
|
1616
1611
|
tr7:
|
1617
|
-
#line
|
1612
|
+
#line 57 "edn_parser.rl"
|
1618
1613
|
{ p--; {p++; cs = 7; goto _out;} }
|
1619
1614
|
goto st7;
|
1620
1615
|
tr8:
|
1621
|
-
#line
|
1616
|
+
#line 20 "edn_parser.rl"
|
1622
1617
|
{ line_number++; }
|
1623
|
-
#line
|
1618
|
+
#line 57 "edn_parser.rl"
|
1624
1619
|
{ p--; {p++; cs = 7; goto _out;} }
|
1625
1620
|
goto st7;
|
1626
1621
|
st7:
|
1627
1622
|
if ( ++p == pe )
|
1628
1623
|
goto _test_eof7;
|
1629
1624
|
case 7:
|
1630
|
-
#line
|
1625
|
+
#line 1626 "edn_parser.cc"
|
1631
1626
|
switch( (*p) ) {
|
1632
1627
|
case 10: goto tr8;
|
1633
1628
|
case 32: goto tr7;
|
@@ -1652,14 +1647,14 @@ case 7:
|
|
1652
1647
|
goto st0;
|
1653
1648
|
goto tr6;
|
1654
1649
|
tr10:
|
1655
|
-
#line
|
1650
|
+
#line 57 "edn_parser.rl"
|
1656
1651
|
{ p--; {p++; cs = 8; goto _out;} }
|
1657
1652
|
goto st8;
|
1658
1653
|
st8:
|
1659
1654
|
if ( ++p == pe )
|
1660
1655
|
goto _test_eof8;
|
1661
1656
|
case 8:
|
1662
|
-
#line
|
1657
|
+
#line 1658 "edn_parser.cc"
|
1663
1658
|
if ( (*p) == 10 )
|
1664
1659
|
goto tr4;
|
1665
1660
|
goto st3;
|
@@ -1729,12 +1724,13 @@ case 9:
|
|
1729
1724
|
_out: {}
|
1730
1725
|
}
|
1731
1726
|
|
1732
|
-
#line
|
1727
|
+
#line 512 "edn_parser.rl"
|
1733
1728
|
|
1734
1729
|
if (cs >= EDN_symbol_first_final) {
|
1735
1730
|
// copy the symbol text
|
1736
|
-
|
1737
|
-
|
1731
|
+
if (s == Qnil)
|
1732
|
+
s = rb_str_new2("");
|
1733
|
+
rb_str_cat(s, p_save, p - p_save);
|
1738
1734
|
return p;
|
1739
1735
|
}
|
1740
1736
|
else if (cs == EDN_symbol_error) {
|
@@ -1749,18 +1745,18 @@ case 9:
|
|
1749
1745
|
|
1750
1746
|
// ============================================================
|
1751
1747
|
// EDN_sequence_common is used to parse EDN containers - elements are
|
1752
|
-
// initially stored in
|
1748
|
+
// initially stored in an array and then the final corresponding
|
1753
1749
|
// container is built from the list (although, for vectors, lists, and
|
1754
1750
|
// sets the same array is used)
|
1755
1751
|
//
|
1756
1752
|
|
1757
|
-
#line
|
1753
|
+
#line 568 "edn_parser.rl"
|
1758
1754
|
|
1759
1755
|
|
1760
1756
|
//
|
1761
1757
|
// vector-specific machine
|
1762
1758
|
|
1763
|
-
#line
|
1759
|
+
#line 1760 "edn_parser.cc"
|
1764
1760
|
static const int EDN_vector_start = 1;
|
1765
1761
|
static const int EDN_vector_first_final = 4;
|
1766
1762
|
static const int EDN_vector_error = 0;
|
@@ -1768,29 +1764,29 @@ static const int EDN_vector_error = 0;
|
|
1768
1764
|
static const int EDN_vector_en_main = 1;
|
1769
1765
|
|
1770
1766
|
|
1771
|
-
#line
|
1767
|
+
#line 584 "edn_parser.rl"
|
1772
1768
|
|
1773
1769
|
|
1774
1770
|
|
1775
1771
|
//
|
1776
1772
|
// vector parsing
|
1777
1773
|
//
|
1778
|
-
const char* edn::Parser::parse_vector(const char *p, const char *pe,
|
1774
|
+
const char* edn::Parser::parse_vector(const char *p, const char *pe, VALUE& v)
|
1779
1775
|
{
|
1780
1776
|
static const char* EDN_TYPE = "vector";
|
1781
1777
|
|
1782
1778
|
int cs;
|
1783
|
-
|
1779
|
+
VALUE elems = rb_ary_new(); // will store the vector's elements
|
1784
1780
|
|
1785
1781
|
|
1786
|
-
#line
|
1782
|
+
#line 1783 "edn_parser.cc"
|
1787
1783
|
{
|
1788
1784
|
cs = EDN_vector_start;
|
1789
1785
|
}
|
1790
1786
|
|
1791
|
-
#line
|
1787
|
+
#line 598 "edn_parser.rl"
|
1792
1788
|
|
1793
|
-
#line
|
1789
|
+
#line 1790 "edn_parser.cc"
|
1794
1790
|
{
|
1795
1791
|
if ( p == pe )
|
1796
1792
|
goto _test_eof;
|
@@ -1801,7 +1797,7 @@ case 1:
|
|
1801
1797
|
goto st2;
|
1802
1798
|
goto st0;
|
1803
1799
|
tr2:
|
1804
|
-
#line
|
1800
|
+
#line 50 "edn_parser.rl"
|
1805
1801
|
{
|
1806
1802
|
std::stringstream s;
|
1807
1803
|
s << "unterminated " << EDN_TYPE;
|
@@ -1809,22 +1805,22 @@ tr2:
|
|
1809
1805
|
p--; {p++; cs = 0; goto _out;}
|
1810
1806
|
}
|
1811
1807
|
goto st0;
|
1812
|
-
#line
|
1808
|
+
#line 1809 "edn_parser.cc"
|
1813
1809
|
st0:
|
1814
1810
|
cs = 0;
|
1815
1811
|
goto _out;
|
1816
1812
|
tr3:
|
1817
|
-
#line
|
1813
|
+
#line 20 "edn_parser.rl"
|
1818
1814
|
{ line_number++; }
|
1819
1815
|
goto st2;
|
1820
1816
|
tr4:
|
1821
|
-
#line
|
1817
|
+
#line 540 "edn_parser.rl"
|
1822
1818
|
{
|
1823
1819
|
// reads an item within a sequence (vector, list, map, or
|
1824
1820
|
// set). Regardless of the sequence type, an array of the
|
1825
1821
|
// items is built. Once done, the sequence parser will convert
|
1826
1822
|
// if needed
|
1827
|
-
|
1823
|
+
VALUE e;
|
1828
1824
|
const char *np = parse_value(p, pe, e);
|
1829
1825
|
if (np == NULL) {
|
1830
1826
|
p--; {p++; cs = 2; goto _out;}
|
@@ -1838,7 +1834,7 @@ tr4:
|
|
1838
1834
|
else {
|
1839
1835
|
// otherwise we add it to the list of elements for the
|
1840
1836
|
// corresponding container
|
1841
|
-
elems
|
1837
|
+
rb_ary_push(elems, e);
|
1842
1838
|
}
|
1843
1839
|
{p = (( np))-1;}
|
1844
1840
|
}
|
@@ -1848,7 +1844,7 @@ st2:
|
|
1848
1844
|
if ( ++p == pe )
|
1849
1845
|
goto _test_eof2;
|
1850
1846
|
case 2:
|
1851
|
-
#line
|
1847
|
+
#line 1848 "edn_parser.cc"
|
1852
1848
|
switch( (*p) ) {
|
1853
1849
|
case 10: goto tr3;
|
1854
1850
|
case 32: goto st2;
|
@@ -1881,14 +1877,14 @@ case 3:
|
|
1881
1877
|
goto tr3;
|
1882
1878
|
goto st3;
|
1883
1879
|
tr6:
|
1884
|
-
#line
|
1880
|
+
#line 57 "edn_parser.rl"
|
1885
1881
|
{ p--; {p++; cs = 4; goto _out;} }
|
1886
1882
|
goto st4;
|
1887
1883
|
st4:
|
1888
1884
|
if ( ++p == pe )
|
1889
1885
|
goto _test_eof4;
|
1890
1886
|
case 4:
|
1891
|
-
#line
|
1887
|
+
#line 1888 "edn_parser.cc"
|
1892
1888
|
goto st0;
|
1893
1889
|
}
|
1894
1890
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -1901,7 +1897,7 @@ case 4:
|
|
1901
1897
|
switch ( cs ) {
|
1902
1898
|
case 2:
|
1903
1899
|
case 3:
|
1904
|
-
#line
|
1900
|
+
#line 50 "edn_parser.rl"
|
1905
1901
|
{
|
1906
1902
|
std::stringstream s;
|
1907
1903
|
s << "unterminated " << EDN_TYPE;
|
@@ -1909,17 +1905,17 @@ case 4:
|
|
1909
1905
|
p--; {p++; cs = 0; goto _out;}
|
1910
1906
|
}
|
1911
1907
|
break;
|
1912
|
-
#line
|
1908
|
+
#line 1909 "edn_parser.cc"
|
1913
1909
|
}
|
1914
1910
|
}
|
1915
1911
|
|
1916
1912
|
_out: {}
|
1917
1913
|
}
|
1918
1914
|
|
1919
|
-
#line
|
1915
|
+
#line 599 "edn_parser.rl"
|
1920
1916
|
|
1921
1917
|
if (cs >= EDN_vector_first_final) {
|
1922
|
-
|
1918
|
+
v = elems;
|
1923
1919
|
return p + 1;
|
1924
1920
|
}
|
1925
1921
|
else if (cs == EDN_vector_error) {
|
@@ -1936,7 +1932,7 @@ case 4:
|
|
1936
1932
|
// list parsing machine
|
1937
1933
|
//
|
1938
1934
|
|
1939
|
-
#line
|
1935
|
+
#line 1936 "edn_parser.cc"
|
1940
1936
|
static const int EDN_list_start = 1;
|
1941
1937
|
static const int EDN_list_first_final = 4;
|
1942
1938
|
static const int EDN_list_error = 0;
|
@@ -1944,28 +1940,28 @@ static const int EDN_list_error = 0;
|
|
1944
1940
|
static const int EDN_list_en_main = 1;
|
1945
1941
|
|
1946
1942
|
|
1947
|
-
#line
|
1943
|
+
#line 628 "edn_parser.rl"
|
1948
1944
|
|
1949
1945
|
|
1950
1946
|
//
|
1951
1947
|
// list parsing
|
1952
1948
|
//
|
1953
|
-
const char* edn::Parser::parse_list(const char *p, const char *pe,
|
1949
|
+
const char* edn::Parser::parse_list(const char *p, const char *pe, VALUE& v)
|
1954
1950
|
{
|
1955
1951
|
static const char* EDN_TYPE = "list";
|
1956
1952
|
|
1957
1953
|
int cs;
|
1958
|
-
|
1954
|
+
VALUE elems = rb_ary_new();
|
1959
1955
|
|
1960
1956
|
|
1961
|
-
#line
|
1957
|
+
#line 1958 "edn_parser.cc"
|
1962
1958
|
{
|
1963
1959
|
cs = EDN_list_start;
|
1964
1960
|
}
|
1965
1961
|
|
1966
|
-
#line
|
1962
|
+
#line 641 "edn_parser.rl"
|
1967
1963
|
|
1968
|
-
#line
|
1964
|
+
#line 1965 "edn_parser.cc"
|
1969
1965
|
{
|
1970
1966
|
if ( p == pe )
|
1971
1967
|
goto _test_eof;
|
@@ -1976,7 +1972,7 @@ case 1:
|
|
1976
1972
|
goto st2;
|
1977
1973
|
goto st0;
|
1978
1974
|
tr2:
|
1979
|
-
#line
|
1975
|
+
#line 50 "edn_parser.rl"
|
1980
1976
|
{
|
1981
1977
|
std::stringstream s;
|
1982
1978
|
s << "unterminated " << EDN_TYPE;
|
@@ -1984,22 +1980,22 @@ tr2:
|
|
1984
1980
|
p--; {p++; cs = 0; goto _out;}
|
1985
1981
|
}
|
1986
1982
|
goto st0;
|
1987
|
-
#line
|
1983
|
+
#line 1984 "edn_parser.cc"
|
1988
1984
|
st0:
|
1989
1985
|
cs = 0;
|
1990
1986
|
goto _out;
|
1991
1987
|
tr3:
|
1992
|
-
#line
|
1988
|
+
#line 20 "edn_parser.rl"
|
1993
1989
|
{ line_number++; }
|
1994
1990
|
goto st2;
|
1995
1991
|
tr4:
|
1996
|
-
#line
|
1992
|
+
#line 540 "edn_parser.rl"
|
1997
1993
|
{
|
1998
1994
|
// reads an item within a sequence (vector, list, map, or
|
1999
1995
|
// set). Regardless of the sequence type, an array of the
|
2000
1996
|
// items is built. Once done, the sequence parser will convert
|
2001
1997
|
// if needed
|
2002
|
-
|
1998
|
+
VALUE e;
|
2003
1999
|
const char *np = parse_value(p, pe, e);
|
2004
2000
|
if (np == NULL) {
|
2005
2001
|
p--; {p++; cs = 2; goto _out;}
|
@@ -2013,7 +2009,7 @@ tr4:
|
|
2013
2009
|
else {
|
2014
2010
|
// otherwise we add it to the list of elements for the
|
2015
2011
|
// corresponding container
|
2016
|
-
elems
|
2012
|
+
rb_ary_push(elems, e);
|
2017
2013
|
}
|
2018
2014
|
{p = (( np))-1;}
|
2019
2015
|
}
|
@@ -2023,7 +2019,7 @@ st2:
|
|
2023
2019
|
if ( ++p == pe )
|
2024
2020
|
goto _test_eof2;
|
2025
2021
|
case 2:
|
2026
|
-
#line
|
2022
|
+
#line 2023 "edn_parser.cc"
|
2027
2023
|
switch( (*p) ) {
|
2028
2024
|
case 10: goto tr3;
|
2029
2025
|
case 32: goto st2;
|
@@ -2048,14 +2044,14 @@ case 2:
|
|
2048
2044
|
goto tr4;
|
2049
2045
|
goto tr2;
|
2050
2046
|
tr5:
|
2051
|
-
#line
|
2047
|
+
#line 57 "edn_parser.rl"
|
2052
2048
|
{ p--; {p++; cs = 4; goto _out;} }
|
2053
2049
|
goto st4;
|
2054
2050
|
st4:
|
2055
2051
|
if ( ++p == pe )
|
2056
2052
|
goto _test_eof4;
|
2057
2053
|
case 4:
|
2058
|
-
#line
|
2054
|
+
#line 2055 "edn_parser.cc"
|
2059
2055
|
goto st0;
|
2060
2056
|
st3:
|
2061
2057
|
if ( ++p == pe )
|
@@ -2075,7 +2071,7 @@ case 3:
|
|
2075
2071
|
switch ( cs ) {
|
2076
2072
|
case 2:
|
2077
2073
|
case 3:
|
2078
|
-
#line
|
2074
|
+
#line 50 "edn_parser.rl"
|
2079
2075
|
{
|
2080
2076
|
std::stringstream s;
|
2081
2077
|
s << "unterminated " << EDN_TYPE;
|
@@ -2083,17 +2079,17 @@ case 3:
|
|
2083
2079
|
p--; {p++; cs = 0; goto _out;}
|
2084
2080
|
}
|
2085
2081
|
break;
|
2086
|
-
#line
|
2082
|
+
#line 2083 "edn_parser.cc"
|
2087
2083
|
}
|
2088
2084
|
}
|
2089
2085
|
|
2090
2086
|
_out: {}
|
2091
2087
|
}
|
2092
2088
|
|
2093
|
-
#line
|
2089
|
+
#line 642 "edn_parser.rl"
|
2094
2090
|
|
2095
2091
|
if (cs >= EDN_list_first_final) {
|
2096
|
-
|
2092
|
+
v = elems;
|
2097
2093
|
return p + 1;
|
2098
2094
|
}
|
2099
2095
|
else if (cs == EDN_list_error) {
|
@@ -2110,7 +2106,7 @@ case 3:
|
|
2110
2106
|
// hash parsing
|
2111
2107
|
//
|
2112
2108
|
|
2113
|
-
#line
|
2109
|
+
#line 2110 "edn_parser.cc"
|
2114
2110
|
static const int EDN_map_start = 1;
|
2115
2111
|
static const int EDN_map_first_final = 4;
|
2116
2112
|
static const int EDN_map_error = 0;
|
@@ -2118,28 +2114,28 @@ static const int EDN_map_error = 0;
|
|
2118
2114
|
static const int EDN_map_en_main = 1;
|
2119
2115
|
|
2120
2116
|
|
2121
|
-
#line
|
2117
|
+
#line 672 "edn_parser.rl"
|
2122
2118
|
|
2123
2119
|
|
2124
2120
|
|
2125
|
-
const char* edn::Parser::parse_map(const char *p, const char *pe,
|
2121
|
+
const char* edn::Parser::parse_map(const char *p, const char *pe, VALUE& v)
|
2126
2122
|
{
|
2127
2123
|
static const char* EDN_TYPE = "map";
|
2128
2124
|
|
2129
2125
|
int cs;
|
2130
2126
|
// since we don't know whether we're looking at a key or value,
|
2131
2127
|
// initially store all elements in a list
|
2132
|
-
|
2128
|
+
VALUE elems = rb_ary_new();
|
2133
2129
|
|
2134
2130
|
|
2135
|
-
#line
|
2131
|
+
#line 2132 "edn_parser.cc"
|
2136
2132
|
{
|
2137
2133
|
cs = EDN_map_start;
|
2138
2134
|
}
|
2139
2135
|
|
2140
|
-
#line
|
2136
|
+
#line 685 "edn_parser.rl"
|
2141
2137
|
|
2142
|
-
#line
|
2138
|
+
#line 2139 "edn_parser.cc"
|
2143
2139
|
{
|
2144
2140
|
if ( p == pe )
|
2145
2141
|
goto _test_eof;
|
@@ -2150,7 +2146,7 @@ case 1:
|
|
2150
2146
|
goto st2;
|
2151
2147
|
goto st0;
|
2152
2148
|
tr2:
|
2153
|
-
#line
|
2149
|
+
#line 50 "edn_parser.rl"
|
2154
2150
|
{
|
2155
2151
|
std::stringstream s;
|
2156
2152
|
s << "unterminated " << EDN_TYPE;
|
@@ -2158,22 +2154,22 @@ tr2:
|
|
2158
2154
|
p--; {p++; cs = 0; goto _out;}
|
2159
2155
|
}
|
2160
2156
|
goto st0;
|
2161
|
-
#line
|
2157
|
+
#line 2158 "edn_parser.cc"
|
2162
2158
|
st0:
|
2163
2159
|
cs = 0;
|
2164
2160
|
goto _out;
|
2165
2161
|
tr3:
|
2166
|
-
#line
|
2162
|
+
#line 20 "edn_parser.rl"
|
2167
2163
|
{ line_number++; }
|
2168
2164
|
goto st2;
|
2169
2165
|
tr4:
|
2170
|
-
#line
|
2166
|
+
#line 540 "edn_parser.rl"
|
2171
2167
|
{
|
2172
2168
|
// reads an item within a sequence (vector, list, map, or
|
2173
2169
|
// set). Regardless of the sequence type, an array of the
|
2174
2170
|
// items is built. Once done, the sequence parser will convert
|
2175
2171
|
// if needed
|
2176
|
-
|
2172
|
+
VALUE e;
|
2177
2173
|
const char *np = parse_value(p, pe, e);
|
2178
2174
|
if (np == NULL) {
|
2179
2175
|
p--; {p++; cs = 2; goto _out;}
|
@@ -2187,7 +2183,7 @@ tr4:
|
|
2187
2183
|
else {
|
2188
2184
|
// otherwise we add it to the list of elements for the
|
2189
2185
|
// corresponding container
|
2190
|
-
elems
|
2186
|
+
rb_ary_push(elems, e);
|
2191
2187
|
}
|
2192
2188
|
{p = (( np))-1;}
|
2193
2189
|
}
|
@@ -2197,7 +2193,7 @@ st2:
|
|
2197
2193
|
if ( ++p == pe )
|
2198
2194
|
goto _test_eof2;
|
2199
2195
|
case 2:
|
2200
|
-
#line
|
2196
|
+
#line 2197 "edn_parser.cc"
|
2201
2197
|
switch( (*p) ) {
|
2202
2198
|
case 10: goto tr3;
|
2203
2199
|
case 32: goto st2;
|
@@ -2230,14 +2226,14 @@ case 3:
|
|
2230
2226
|
goto tr3;
|
2231
2227
|
goto st3;
|
2232
2228
|
tr6:
|
2233
|
-
#line
|
2229
|
+
#line 57 "edn_parser.rl"
|
2234
2230
|
{ p--; {p++; cs = 4; goto _out;} }
|
2235
2231
|
goto st4;
|
2236
2232
|
st4:
|
2237
2233
|
if ( ++p == pe )
|
2238
2234
|
goto _test_eof4;
|
2239
2235
|
case 4:
|
2240
|
-
#line
|
2236
|
+
#line 2237 "edn_parser.cc"
|
2241
2237
|
goto st0;
|
2242
2238
|
}
|
2243
2239
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -2250,7 +2246,7 @@ case 4:
|
|
2250
2246
|
switch ( cs ) {
|
2251
2247
|
case 2:
|
2252
2248
|
case 3:
|
2253
|
-
#line
|
2249
|
+
#line 50 "edn_parser.rl"
|
2254
2250
|
{
|
2255
2251
|
std::stringstream s;
|
2256
2252
|
s << "unterminated " << EDN_TYPE;
|
@@ -2258,32 +2254,32 @@ case 4:
|
|
2258
2254
|
p--; {p++; cs = 0; goto _out;}
|
2259
2255
|
}
|
2260
2256
|
break;
|
2261
|
-
#line
|
2257
|
+
#line 2258 "edn_parser.cc"
|
2262
2258
|
}
|
2263
2259
|
}
|
2264
2260
|
|
2265
2261
|
_out: {}
|
2266
2262
|
}
|
2267
2263
|
|
2268
|
-
#line
|
2264
|
+
#line 686 "edn_parser.rl"
|
2269
2265
|
|
2270
2266
|
if (cs >= EDN_map_first_final) {
|
2271
2267
|
|
2272
2268
|
// hash parsing is done. Make sure we have an even count
|
2273
|
-
if ((elems
|
2269
|
+
if ((RARRAY_LEN(elems) % 2) != 0) {
|
2274
2270
|
error(__FUNCTION__, "odd number of elements in map");
|
2275
2271
|
return pe;
|
2276
2272
|
}
|
2277
2273
|
|
2278
2274
|
// now convert the sequence to a hash
|
2279
|
-
|
2280
|
-
while (elems
|
2275
|
+
VALUE rslt = rb_hash_new();
|
2276
|
+
while (RARRAY_LEN(elems) > 0)
|
2281
2277
|
{
|
2282
|
-
|
2283
|
-
rslt
|
2278
|
+
VALUE k = rb_ary_shift(elems);
|
2279
|
+
rb_hash_aset(rslt, k, rb_ary_shift(elems));
|
2284
2280
|
}
|
2285
2281
|
|
2286
|
-
|
2282
|
+
v = rslt;
|
2287
2283
|
return p + 1;
|
2288
2284
|
}
|
2289
2285
|
else if (cs == EDN_map_error) {
|
@@ -2301,7 +2297,7 @@ case 4:
|
|
2301
2297
|
// the remaining data to the correct parser
|
2302
2298
|
//
|
2303
2299
|
|
2304
|
-
#line
|
2300
|
+
#line 2301 "edn_parser.cc"
|
2305
2301
|
static const int EDN_dispatch_start = 1;
|
2306
2302
|
static const int EDN_dispatch_first_final = 2;
|
2307
2303
|
static const int EDN_dispatch_error = 0;
|
@@ -2309,23 +2305,23 @@ static const int EDN_dispatch_error = 0;
|
|
2309
2305
|
static const int EDN_dispatch_en_main = 1;
|
2310
2306
|
|
2311
2307
|
|
2312
|
-
#line
|
2308
|
+
#line 750 "edn_parser.rl"
|
2313
2309
|
|
2314
2310
|
|
2315
2311
|
|
2316
|
-
const char* edn::Parser::parse_dispatch(const char *p, const char *pe,
|
2312
|
+
const char* edn::Parser::parse_dispatch(const char *p, const char *pe, VALUE& v)
|
2317
2313
|
{
|
2318
2314
|
int cs;
|
2319
2315
|
|
2320
2316
|
|
2321
|
-
#line
|
2317
|
+
#line 2318 "edn_parser.cc"
|
2322
2318
|
{
|
2323
2319
|
cs = EDN_dispatch_start;
|
2324
2320
|
}
|
2325
2321
|
|
2326
|
-
#line
|
2322
|
+
#line 758 "edn_parser.rl"
|
2327
2323
|
|
2328
|
-
#line
|
2324
|
+
#line 2325 "edn_parser.cc"
|
2329
2325
|
{
|
2330
2326
|
if ( p == pe )
|
2331
2327
|
goto _test_eof;
|
@@ -2346,40 +2342,40 @@ st0:
|
|
2346
2342
|
cs = 0;
|
2347
2343
|
goto _out;
|
2348
2344
|
tr0:
|
2349
|
-
#line
|
2345
|
+
#line 738 "edn_parser.rl"
|
2350
2346
|
{
|
2351
2347
|
// #inst, #uuid, or #user/tag
|
2352
|
-
const char *np = parse_tagged(p, pe,
|
2348
|
+
const char *np = parse_tagged(p, pe, v);
|
2353
2349
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
2354
2350
|
}
|
2355
|
-
#line
|
2351
|
+
#line 57 "edn_parser.rl"
|
2356
2352
|
{ p--; {p++; cs = 2; goto _out;} }
|
2357
2353
|
goto st2;
|
2358
2354
|
tr2:
|
2359
|
-
#line
|
2355
|
+
#line 732 "edn_parser.rl"
|
2360
2356
|
{
|
2361
2357
|
// discard token #_
|
2362
2358
|
const char *np = parse_discard(p, pe);
|
2363
2359
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
2364
2360
|
}
|
2365
|
-
#line
|
2361
|
+
#line 57 "edn_parser.rl"
|
2366
2362
|
{ p--; {p++; cs = 2; goto _out;} }
|
2367
2363
|
goto st2;
|
2368
2364
|
tr3:
|
2369
|
-
#line
|
2365
|
+
#line 726 "edn_parser.rl"
|
2370
2366
|
{
|
2371
2367
|
// #{ }
|
2372
|
-
const char *np = parse_set(p, pe,
|
2368
|
+
const char *np = parse_set(p, pe, v);
|
2373
2369
|
if (np == NULL) { p--; {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
2374
2370
|
}
|
2375
|
-
#line
|
2371
|
+
#line 57 "edn_parser.rl"
|
2376
2372
|
{ p--; {p++; cs = 2; goto _out;} }
|
2377
2373
|
goto st2;
|
2378
2374
|
st2:
|
2379
2375
|
if ( ++p == pe )
|
2380
2376
|
goto _test_eof2;
|
2381
2377
|
case 2:
|
2382
|
-
#line
|
2378
|
+
#line 2379 "edn_parser.cc"
|
2383
2379
|
goto st0;
|
2384
2380
|
}
|
2385
2381
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -2388,7 +2384,7 @@ case 2:
|
|
2388
2384
|
_out: {}
|
2389
2385
|
}
|
2390
2386
|
|
2391
|
-
#line
|
2387
|
+
#line 759 "edn_parser.rl"
|
2392
2388
|
|
2393
2389
|
if (cs >= EDN_dispatch_first_final) {
|
2394
2390
|
return p + 1;
|
@@ -2407,7 +2403,7 @@ case 2:
|
|
2407
2403
|
// set parsing machine
|
2408
2404
|
//
|
2409
2405
|
|
2410
|
-
#line
|
2406
|
+
#line 2407 "edn_parser.cc"
|
2411
2407
|
static const int EDN_set_start = 1;
|
2412
2408
|
static const int EDN_set_first_final = 4;
|
2413
2409
|
static const int EDN_set_error = 0;
|
@@ -2415,28 +2411,28 @@ static const int EDN_set_error = 0;
|
|
2415
2411
|
static const int EDN_set_en_main = 1;
|
2416
2412
|
|
2417
2413
|
|
2418
|
-
#line
|
2414
|
+
#line 788 "edn_parser.rl"
|
2419
2415
|
|
2420
2416
|
|
2421
2417
|
//
|
2422
2418
|
// set parsing
|
2423
2419
|
//
|
2424
|
-
const char* edn::Parser::parse_set(const char *p, const char *pe,
|
2420
|
+
const char* edn::Parser::parse_set(const char *p, const char *pe, VALUE& v)
|
2425
2421
|
{
|
2426
2422
|
static const char* EDN_TYPE = "set";
|
2427
2423
|
|
2428
2424
|
int cs;
|
2429
|
-
|
2425
|
+
VALUE elems = rb_ary_new(); // stored as an array
|
2430
2426
|
|
2431
2427
|
|
2432
|
-
#line
|
2428
|
+
#line 2429 "edn_parser.cc"
|
2433
2429
|
{
|
2434
2430
|
cs = EDN_set_start;
|
2435
2431
|
}
|
2436
2432
|
|
2437
|
-
#line
|
2433
|
+
#line 801 "edn_parser.rl"
|
2438
2434
|
|
2439
|
-
#line
|
2435
|
+
#line 2436 "edn_parser.cc"
|
2440
2436
|
{
|
2441
2437
|
if ( p == pe )
|
2442
2438
|
goto _test_eof;
|
@@ -2447,7 +2443,7 @@ case 1:
|
|
2447
2443
|
goto st2;
|
2448
2444
|
goto st0;
|
2449
2445
|
tr2:
|
2450
|
-
#line
|
2446
|
+
#line 50 "edn_parser.rl"
|
2451
2447
|
{
|
2452
2448
|
std::stringstream s;
|
2453
2449
|
s << "unterminated " << EDN_TYPE;
|
@@ -2455,22 +2451,22 @@ tr2:
|
|
2455
2451
|
p--; {p++; cs = 0; goto _out;}
|
2456
2452
|
}
|
2457
2453
|
goto st0;
|
2458
|
-
#line
|
2454
|
+
#line 2455 "edn_parser.cc"
|
2459
2455
|
st0:
|
2460
2456
|
cs = 0;
|
2461
2457
|
goto _out;
|
2462
2458
|
tr3:
|
2463
|
-
#line
|
2459
|
+
#line 20 "edn_parser.rl"
|
2464
2460
|
{ line_number++; }
|
2465
2461
|
goto st2;
|
2466
2462
|
tr4:
|
2467
|
-
#line
|
2463
|
+
#line 540 "edn_parser.rl"
|
2468
2464
|
{
|
2469
2465
|
// reads an item within a sequence (vector, list, map, or
|
2470
2466
|
// set). Regardless of the sequence type, an array of the
|
2471
2467
|
// items is built. Once done, the sequence parser will convert
|
2472
2468
|
// if needed
|
2473
|
-
|
2469
|
+
VALUE e;
|
2474
2470
|
const char *np = parse_value(p, pe, e);
|
2475
2471
|
if (np == NULL) {
|
2476
2472
|
p--; {p++; cs = 2; goto _out;}
|
@@ -2484,7 +2480,7 @@ tr4:
|
|
2484
2480
|
else {
|
2485
2481
|
// otherwise we add it to the list of elements for the
|
2486
2482
|
// corresponding container
|
2487
|
-
elems
|
2483
|
+
rb_ary_push(elems, e);
|
2488
2484
|
}
|
2489
2485
|
{p = (( np))-1;}
|
2490
2486
|
}
|
@@ -2494,7 +2490,7 @@ st2:
|
|
2494
2490
|
if ( ++p == pe )
|
2495
2491
|
goto _test_eof2;
|
2496
2492
|
case 2:
|
2497
|
-
#line
|
2493
|
+
#line 2494 "edn_parser.cc"
|
2498
2494
|
switch( (*p) ) {
|
2499
2495
|
case 10: goto tr3;
|
2500
2496
|
case 32: goto st2;
|
@@ -2527,14 +2523,14 @@ case 3:
|
|
2527
2523
|
goto tr3;
|
2528
2524
|
goto st3;
|
2529
2525
|
tr6:
|
2530
|
-
#line
|
2526
|
+
#line 57 "edn_parser.rl"
|
2531
2527
|
{ p--; {p++; cs = 4; goto _out;} }
|
2532
2528
|
goto st4;
|
2533
2529
|
st4:
|
2534
2530
|
if ( ++p == pe )
|
2535
2531
|
goto _test_eof4;
|
2536
2532
|
case 4:
|
2537
|
-
#line
|
2533
|
+
#line 2534 "edn_parser.cc"
|
2538
2534
|
goto st0;
|
2539
2535
|
}
|
2540
2536
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -2547,7 +2543,7 @@ case 4:
|
|
2547
2543
|
switch ( cs ) {
|
2548
2544
|
case 2:
|
2549
2545
|
case 3:
|
2550
|
-
#line
|
2546
|
+
#line 50 "edn_parser.rl"
|
2551
2547
|
{
|
2552
2548
|
std::stringstream s;
|
2553
2549
|
s << "unterminated " << EDN_TYPE;
|
@@ -2555,18 +2551,18 @@ case 4:
|
|
2555
2551
|
p--; {p++; cs = 0; goto _out;}
|
2556
2552
|
}
|
2557
2553
|
break;
|
2558
|
-
#line
|
2554
|
+
#line 2555 "edn_parser.cc"
|
2559
2555
|
}
|
2560
2556
|
}
|
2561
2557
|
|
2562
2558
|
_out: {}
|
2563
2559
|
}
|
2564
2560
|
|
2565
|
-
#line
|
2561
|
+
#line 802 "edn_parser.rl"
|
2566
2562
|
|
2567
2563
|
if (cs >= EDN_set_first_final) {
|
2568
2564
|
// all elements collected; now convert to a set
|
2569
|
-
|
2565
|
+
v = Parser::make_ruby_set(elems);
|
2570
2566
|
return p + 1;
|
2571
2567
|
}
|
2572
2568
|
else if (cs == EDN_set_error) {
|
@@ -2581,12 +2577,11 @@ case 4:
|
|
2581
2577
|
|
2582
2578
|
// ============================================================
|
2583
2579
|
// discard - consume the discard token and parse the next value to
|
2584
|
-
// discard. TODO: perhaps optimize this so no object data is built
|
2585
|
-
//
|
2586
|
-
// delimiters
|
2580
|
+
// discard. TODO: perhaps optimize this so no object data is built by
|
2581
|
+
// defining a machine to consume items within container delimiters
|
2587
2582
|
//
|
2588
2583
|
|
2589
|
-
#line
|
2584
|
+
#line 2585 "edn_parser.cc"
|
2590
2585
|
static const int EDN_discard_start = 1;
|
2591
2586
|
static const int EDN_discard_first_final = 4;
|
2592
2587
|
static const int EDN_discard_error = 0;
|
@@ -2594,24 +2589,24 @@ static const int EDN_discard_error = 0;
|
|
2594
2589
|
static const int EDN_discard_en_main = 1;
|
2595
2590
|
|
2596
2591
|
|
2597
|
-
#line
|
2592
|
+
#line 848 "edn_parser.rl"
|
2598
2593
|
|
2599
2594
|
|
2600
2595
|
|
2601
2596
|
const char* edn::Parser::parse_discard(const char *p, const char *pe)
|
2602
2597
|
{
|
2603
2598
|
int cs;
|
2604
|
-
|
2599
|
+
VALUE v;
|
2605
2600
|
|
2606
2601
|
|
2607
|
-
#line
|
2602
|
+
#line 2603 "edn_parser.cc"
|
2608
2603
|
{
|
2609
2604
|
cs = EDN_discard_start;
|
2610
2605
|
}
|
2611
2606
|
|
2612
|
-
#line
|
2607
|
+
#line 857 "edn_parser.rl"
|
2613
2608
|
|
2614
|
-
#line
|
2609
|
+
#line 2610 "edn_parser.cc"
|
2615
2610
|
{
|
2616
2611
|
if ( p == pe )
|
2617
2612
|
goto _test_eof;
|
@@ -2625,14 +2620,14 @@ st0:
|
|
2625
2620
|
cs = 0;
|
2626
2621
|
goto _out;
|
2627
2622
|
tr2:
|
2628
|
-
#line
|
2623
|
+
#line 20 "edn_parser.rl"
|
2629
2624
|
{ line_number++; }
|
2630
2625
|
goto st2;
|
2631
2626
|
st2:
|
2632
2627
|
if ( ++p == pe )
|
2633
2628
|
goto _test_eof2;
|
2634
2629
|
case 2:
|
2635
|
-
#line
|
2630
|
+
#line 2631 "edn_parser.cc"
|
2636
2631
|
switch( (*p) ) {
|
2637
2632
|
case 10: goto tr2;
|
2638
2633
|
case 32: goto st2;
|
@@ -2657,27 +2652,27 @@ case 2:
|
|
2657
2652
|
goto tr3;
|
2658
2653
|
goto st0;
|
2659
2654
|
tr3:
|
2660
|
-
#line
|
2655
|
+
#line 831 "edn_parser.rl"
|
2661
2656
|
{
|
2662
|
-
const char *np = parse_value(p, pe,
|
2657
|
+
const char *np = parse_value(p, pe, v);
|
2663
2658
|
if (np) {
|
2664
2659
|
// this token is to be discard it so store it in the
|
2665
2660
|
// discard stack - we really don't need to save it so this
|
2666
2661
|
// could be simplified
|
2667
|
-
discard.push(
|
2662
|
+
discard.push(v);
|
2668
2663
|
{p = (( np))-1;}
|
2669
2664
|
} else {
|
2670
2665
|
p--; {p++; cs = 4; goto _out;}
|
2671
2666
|
}
|
2672
2667
|
}
|
2673
|
-
#line
|
2668
|
+
#line 57 "edn_parser.rl"
|
2674
2669
|
{ p--; {p++; cs = 4; goto _out;} }
|
2675
2670
|
goto st4;
|
2676
2671
|
st4:
|
2677
2672
|
if ( ++p == pe )
|
2678
2673
|
goto _test_eof4;
|
2679
2674
|
case 4:
|
2680
|
-
#line
|
2675
|
+
#line 2676 "edn_parser.cc"
|
2681
2676
|
goto st0;
|
2682
2677
|
st3:
|
2683
2678
|
if ( ++p == pe )
|
@@ -2695,7 +2690,7 @@ case 3:
|
|
2695
2690
|
_out: {}
|
2696
2691
|
}
|
2697
2692
|
|
2698
|
-
#line
|
2693
|
+
#line 858 "edn_parser.rl"
|
2699
2694
|
|
2700
2695
|
if (cs >= EDN_discard_first_final) {
|
2701
2696
|
return p + 1;
|
@@ -2726,7 +2721,7 @@ case 3:
|
|
2726
2721
|
// 2. add parse checks for uuid and inst for better error reporting
|
2727
2722
|
//
|
2728
2723
|
|
2729
|
-
#line
|
2724
|
+
#line 2725 "edn_parser.cc"
|
2730
2725
|
static const int EDN_tagged_start = 1;
|
2731
2726
|
static const int EDN_tagged_first_final = 6;
|
2732
2727
|
static const int EDN_tagged_error = 0;
|
@@ -2734,26 +2729,26 @@ static const int EDN_tagged_error = 0;
|
|
2734
2729
|
static const int EDN_tagged_en_main = 1;
|
2735
2730
|
|
2736
2731
|
|
2737
|
-
#line
|
2732
|
+
#line 909 "edn_parser.rl"
|
2738
2733
|
|
2739
2734
|
|
2740
2735
|
|
2741
|
-
const char* edn::Parser::parse_tagged(const char *p, const char *pe,
|
2736
|
+
const char* edn::Parser::parse_tagged(const char *p, const char *pe, VALUE& v)
|
2742
2737
|
{
|
2743
|
-
|
2744
|
-
|
2738
|
+
VALUE sym_name = Qnil;
|
2739
|
+
VALUE data = Qnil;
|
2745
2740
|
|
2746
2741
|
int cs;
|
2747
2742
|
|
2748
2743
|
|
2749
|
-
#line
|
2744
|
+
#line 2745 "edn_parser.cc"
|
2750
2745
|
{
|
2751
2746
|
cs = EDN_tagged_start;
|
2752
2747
|
}
|
2753
2748
|
|
2754
|
-
#line
|
2749
|
+
#line 920 "edn_parser.rl"
|
2755
2750
|
|
2756
|
-
#line
|
2751
|
+
#line 2752 "edn_parser.cc"
|
2757
2752
|
{
|
2758
2753
|
if ( p == pe )
|
2759
2754
|
goto _test_eof;
|
@@ -2770,7 +2765,7 @@ st0:
|
|
2770
2765
|
cs = 0;
|
2771
2766
|
goto _out;
|
2772
2767
|
tr0:
|
2773
|
-
#line
|
2768
|
+
#line 896 "edn_parser.rl"
|
2774
2769
|
{
|
2775
2770
|
// parses the symbol portion of the pair
|
2776
2771
|
const char *np = parse_symbol(p, pe, sym_name);
|
@@ -2781,7 +2776,7 @@ st2:
|
|
2781
2776
|
if ( ++p == pe )
|
2782
2777
|
goto _test_eof2;
|
2783
2778
|
case 2:
|
2784
|
-
#line
|
2779
|
+
#line 2780 "edn_parser.cc"
|
2785
2780
|
switch( (*p) ) {
|
2786
2781
|
case 10: goto tr3;
|
2787
2782
|
case 32: goto st3;
|
@@ -2818,14 +2813,14 @@ case 2:
|
|
2818
2813
|
goto tr5;
|
2819
2814
|
goto st0;
|
2820
2815
|
tr3:
|
2821
|
-
#line
|
2816
|
+
#line 20 "edn_parser.rl"
|
2822
2817
|
{ line_number++; }
|
2823
2818
|
goto st3;
|
2824
2819
|
st3:
|
2825
2820
|
if ( ++p == pe )
|
2826
2821
|
goto _test_eof3;
|
2827
2822
|
case 3:
|
2828
|
-
#line
|
2823
|
+
#line 2824 "edn_parser.cc"
|
2829
2824
|
switch( (*p) ) {
|
2830
2825
|
case 10: goto tr3;
|
2831
2826
|
case 32: goto st3;
|
@@ -2850,20 +2845,20 @@ case 3:
|
|
2850
2845
|
goto tr4;
|
2851
2846
|
goto st0;
|
2852
2847
|
tr4:
|
2853
|
-
#line
|
2848
|
+
#line 901 "edn_parser.rl"
|
2854
2849
|
{
|
2855
2850
|
// parses the value portion
|
2856
2851
|
const char *np = parse_value(p, pe, data);
|
2857
2852
|
if (np == NULL) { p--; {p++; cs = 6; goto _out;} } else { {p = (( np))-1;} }
|
2858
2853
|
}
|
2859
|
-
#line
|
2854
|
+
#line 57 "edn_parser.rl"
|
2860
2855
|
{ p--; {p++; cs = 6; goto _out;} }
|
2861
2856
|
goto st6;
|
2862
2857
|
st6:
|
2863
2858
|
if ( ++p == pe )
|
2864
2859
|
goto _test_eof6;
|
2865
2860
|
case 6:
|
2866
|
-
#line
|
2861
|
+
#line 2862 "edn_parser.cc"
|
2867
2862
|
goto st0;
|
2868
2863
|
st4:
|
2869
2864
|
if ( ++p == pe )
|
@@ -2873,20 +2868,20 @@ case 4:
|
|
2873
2868
|
goto tr3;
|
2874
2869
|
goto st4;
|
2875
2870
|
tr5:
|
2876
|
-
#line
|
2871
|
+
#line 901 "edn_parser.rl"
|
2877
2872
|
{
|
2878
2873
|
// parses the value portion
|
2879
2874
|
const char *np = parse_value(p, pe, data);
|
2880
2875
|
if (np == NULL) { p--; {p++; cs = 7; goto _out;} } else { {p = (( np))-1;} }
|
2881
2876
|
}
|
2882
|
-
#line
|
2877
|
+
#line 57 "edn_parser.rl"
|
2883
2878
|
{ p--; {p++; cs = 7; goto _out;} }
|
2884
2879
|
goto st7;
|
2885
2880
|
st7:
|
2886
2881
|
if ( ++p == pe )
|
2887
2882
|
goto _test_eof7;
|
2888
2883
|
case 7:
|
2889
|
-
#line
|
2884
|
+
#line 2885 "edn_parser.cc"
|
2890
2885
|
switch( (*p) ) {
|
2891
2886
|
case 10: goto tr3;
|
2892
2887
|
case 32: goto st3;
|
@@ -2923,20 +2918,20 @@ case 7:
|
|
2923
2918
|
goto tr5;
|
2924
2919
|
goto st0;
|
2925
2920
|
tr6:
|
2926
|
-
#line
|
2921
|
+
#line 901 "edn_parser.rl"
|
2927
2922
|
{
|
2928
2923
|
// parses the value portion
|
2929
2924
|
const char *np = parse_value(p, pe, data);
|
2930
2925
|
if (np == NULL) { p--; {p++; cs = 8; goto _out;} } else { {p = (( np))-1;} }
|
2931
2926
|
}
|
2932
|
-
#line
|
2927
|
+
#line 57 "edn_parser.rl"
|
2933
2928
|
{ p--; {p++; cs = 8; goto _out;} }
|
2934
2929
|
goto st8;
|
2935
2930
|
st8:
|
2936
2931
|
if ( ++p == pe )
|
2937
2932
|
goto _test_eof8;
|
2938
2933
|
case 8:
|
2939
|
-
#line
|
2934
|
+
#line 2935 "edn_parser.cc"
|
2940
2935
|
if ( (*p) > 90 ) {
|
2941
2936
|
if ( 97 <= (*p) && (*p) <= 122 )
|
2942
2937
|
goto st5;
|
@@ -2983,20 +2978,20 @@ case 5:
|
|
2983
2978
|
goto tr8;
|
2984
2979
|
goto st0;
|
2985
2980
|
tr8:
|
2986
|
-
#line
|
2981
|
+
#line 901 "edn_parser.rl"
|
2987
2982
|
{
|
2988
2983
|
// parses the value portion
|
2989
2984
|
const char *np = parse_value(p, pe, data);
|
2990
2985
|
if (np == NULL) { p--; {p++; cs = 9; goto _out;} } else { {p = (( np))-1;} }
|
2991
2986
|
}
|
2992
|
-
#line
|
2987
|
+
#line 57 "edn_parser.rl"
|
2993
2988
|
{ p--; {p++; cs = 9; goto _out;} }
|
2994
2989
|
goto st9;
|
2995
2990
|
st9:
|
2996
2991
|
if ( ++p == pe )
|
2997
2992
|
goto _test_eof9;
|
2998
2993
|
case 9:
|
2999
|
-
#line
|
2994
|
+
#line 2995 "edn_parser.cc"
|
3000
2995
|
switch( (*p) ) {
|
3001
2996
|
case 10: goto tr3;
|
3002
2997
|
case 32: goto st3;
|
@@ -3046,7 +3041,7 @@ case 9:
|
|
3046
3041
|
_out: {}
|
3047
3042
|
}
|
3048
3043
|
|
3049
|
-
#line
|
3044
|
+
#line 921 "edn_parser.rl"
|
3050
3045
|
|
3051
3046
|
if (cs >= EDN_tagged_first_final) {
|
3052
3047
|
//std::cerr << __FUNCTION__ << " parse symbol name as '" << sym_name << "', value is: " << data << std::endl;
|
@@ -3054,9 +3049,9 @@ case 9:
|
|
3054
3049
|
try {
|
3055
3050
|
// tagged_element makes a call to ruby which may throw an
|
3056
3051
|
// exception when parsing the data
|
3057
|
-
|
3058
|
-
} catch (
|
3059
|
-
error(__FUNCTION__, e.
|
3052
|
+
v = Parser::tagged_element(sym_name, data);
|
3053
|
+
} catch (std::exception& e) {
|
3054
|
+
error(__FUNCTION__, e.what());
|
3060
3055
|
return pe;
|
3061
3056
|
}
|
3062
3057
|
return p + 1;
|
@@ -3072,58 +3067,53 @@ case 9:
|
|
3072
3067
|
|
3073
3068
|
|
3074
3069
|
// ============================================================
|
3075
|
-
//
|
3070
|
+
// parses entire input but expects single valid token at the
|
3071
|
+
// top-level, therefore, does not tokenize source stream
|
3076
3072
|
//
|
3077
3073
|
|
3078
|
-
#line
|
3079
|
-
static const int
|
3080
|
-
static const int
|
3074
|
+
#line 3075 "edn_parser.cc"
|
3075
|
+
static const int EDN_parser_start = 2;
|
3076
|
+
static const int EDN_parser_first_final = 2;
|
3077
|
+
static const int EDN_parser_error = 0;
|
3081
3078
|
|
3082
|
-
static const int
|
3079
|
+
static const int EDN_parser_en_main = 2;
|
3083
3080
|
|
3084
3081
|
|
3085
|
-
#line
|
3082
|
+
#line 965 "edn_parser.rl"
|
3086
3083
|
|
3087
3084
|
|
3088
|
-
|
3089
|
-
|
3090
|
-
// but EDN's Reader allows token by token parsing
|
3091
|
-
Rice::Object edn::Parser::parse(const char* buf, std::size_t len)
|
3085
|
+
|
3086
|
+
VALUE edn::Parser::parse(const char* src, std::size_t len)
|
3092
3087
|
{
|
3093
3088
|
int cs;
|
3094
|
-
|
3095
|
-
const char *pe;
|
3096
|
-
Rice::Object result;
|
3089
|
+
VALUE result = Qnil;
|
3097
3090
|
|
3098
|
-
//
|
3099
|
-
|
3100
|
-
p_save = NULL;
|
3101
|
-
while (!discard.empty())
|
3102
|
-
discard.pop();
|
3091
|
+
// reset line counter & discard stack
|
3092
|
+
reset();
|
3103
3093
|
|
3104
3094
|
|
3105
|
-
#line
|
3095
|
+
#line 3096 "edn_parser.cc"
|
3106
3096
|
{
|
3107
|
-
cs =
|
3097
|
+
cs = EDN_parser_start;
|
3108
3098
|
}
|
3109
3099
|
|
3110
|
-
#line
|
3111
|
-
p =
|
3100
|
+
#line 977 "edn_parser.rl"
|
3101
|
+
p = src;
|
3112
3102
|
pe = p + len;
|
3113
|
-
eof = pe;
|
3103
|
+
eof = pe;
|
3114
3104
|
|
3115
|
-
#line
|
3105
|
+
#line 3106 "edn_parser.cc"
|
3116
3106
|
{
|
3117
3107
|
if ( p == pe )
|
3118
3108
|
goto _test_eof;
|
3119
3109
|
switch ( cs )
|
3120
3110
|
{
|
3121
3111
|
tr1:
|
3122
|
-
#line
|
3112
|
+
#line 20 "edn_parser.rl"
|
3123
3113
|
{ line_number++; }
|
3124
3114
|
goto st2;
|
3125
3115
|
tr4:
|
3126
|
-
#line
|
3116
|
+
#line 955 "edn_parser.rl"
|
3127
3117
|
{
|
3128
3118
|
const char* np = parse_value(p, pe, result);
|
3129
3119
|
if (np == NULL) { {p = (( pe))-1;} {p++; cs = 2; goto _out;} } else {p = (( np))-1;}
|
@@ -3133,7 +3123,7 @@ st2:
|
|
3133
3123
|
if ( ++p == pe )
|
3134
3124
|
goto _test_eof2;
|
3135
3125
|
case 2:
|
3136
|
-
#line
|
3126
|
+
#line 3127 "edn_parser.cc"
|
3137
3127
|
switch( (*p) ) {
|
3138
3128
|
case 10: goto tr1;
|
3139
3129
|
case 32: goto st2;
|
@@ -3175,16 +3165,149 @@ case 1:
|
|
3175
3165
|
_out: {}
|
3176
3166
|
}
|
3177
3167
|
|
3178
|
-
#line
|
3168
|
+
#line 981 "edn_parser.rl"
|
3179
3169
|
|
3180
|
-
if (cs ==
|
3170
|
+
if (cs == EDN_parser_error) {
|
3181
3171
|
error(__FUNCTION__, *p);
|
3182
3172
|
return Qnil;
|
3183
3173
|
}
|
3184
|
-
else if (cs ==
|
3174
|
+
else if (cs == EDN_parser_first_final) {
|
3175
|
+
// whole source is parsed so reset
|
3176
|
+
p = pe = eof = NULL;
|
3177
|
+
reset();
|
3178
|
+
}
|
3179
|
+
else if (cs == EDN_parser_en_main) {} // silence ragel warning
|
3180
|
+
return result;
|
3181
|
+
}
|
3182
|
+
|
3183
|
+
|
3184
|
+
// ============================================================
|
3185
|
+
// token-by-token machine
|
3186
|
+
//
|
3187
|
+
|
3188
|
+
#line 3189 "edn_parser.cc"
|
3189
|
+
static const int EDN_tokens_start = 1;
|
3190
|
+
|
3191
|
+
static const int EDN_tokens_en_main = 1;
|
3192
|
+
|
3193
|
+
|
3194
|
+
#line 1013 "edn_parser.rl"
|
3195
|
+
|
3196
|
+
|
3197
|
+
|
3198
|
+
//
|
3199
|
+
//
|
3200
|
+
VALUE edn::Parser::next()
|
3201
|
+
{
|
3202
|
+
VALUE result = Qnil;
|
3203
|
+
int cs;
|
3204
|
+
|
3205
|
+
|
3206
|
+
#line 3207 "edn_parser.cc"
|
3207
|
+
{
|
3208
|
+
cs = EDN_tokens_start;
|
3209
|
+
}
|
3210
|
+
|
3211
|
+
#line 1024 "edn_parser.rl"
|
3212
|
+
|
3213
|
+
#line 3214 "edn_parser.cc"
|
3214
|
+
{
|
3215
|
+
if ( p == pe )
|
3216
|
+
goto _test_eof;
|
3217
|
+
switch ( cs )
|
3218
|
+
{
|
3219
|
+
tr2:
|
3220
|
+
#line 20 "edn_parser.rl"
|
3221
|
+
{ line_number++; }
|
3222
|
+
goto st1;
|
3223
|
+
st1:
|
3224
|
+
if ( ++p == pe )
|
3225
|
+
goto _test_eof1;
|
3226
|
+
case 1:
|
3227
|
+
#line 3228 "edn_parser.cc"
|
3228
|
+
switch( (*p) ) {
|
3229
|
+
case 10: goto tr2;
|
3230
|
+
case 32: goto st1;
|
3231
|
+
case 40: goto tr3;
|
3232
|
+
case 44: goto st1;
|
3233
|
+
case 59: goto st3;
|
3234
|
+
case 95: goto tr3;
|
3235
|
+
}
|
3236
|
+
if ( (*p) < 42 ) {
|
3237
|
+
if ( (*p) > 13 ) {
|
3238
|
+
if ( 33 <= (*p) && (*p) <= 38 )
|
3239
|
+
goto tr3;
|
3240
|
+
} else if ( (*p) >= 9 )
|
3241
|
+
goto st1;
|
3242
|
+
} else if ( (*p) > 63 ) {
|
3243
|
+
if ( (*p) > 92 ) {
|
3244
|
+
if ( 97 <= (*p) && (*p) <= 123 )
|
3245
|
+
goto tr3;
|
3246
|
+
} else if ( (*p) >= 65 )
|
3247
|
+
goto tr3;
|
3248
|
+
} else
|
3249
|
+
goto tr3;
|
3250
|
+
goto st0;
|
3251
|
+
st0:
|
3252
|
+
cs = 0;
|
3253
|
+
goto _out;
|
3254
|
+
tr6:
|
3255
|
+
#line 20 "edn_parser.rl"
|
3256
|
+
{ line_number++; }
|
3257
|
+
goto st4;
|
3258
|
+
tr3:
|
3259
|
+
#line 1005 "edn_parser.rl"
|
3260
|
+
{
|
3261
|
+
const char* np = parse_value(p, pe, result);
|
3262
|
+
if (np == NULL) { p--; {p++; cs = 4; goto _out;} } else { {p = (( np))-1;} }
|
3263
|
+
}
|
3264
|
+
goto st4;
|
3265
|
+
st4:
|
3266
|
+
if ( ++p == pe )
|
3267
|
+
goto _test_eof4;
|
3268
|
+
case 4:
|
3269
|
+
#line 3270 "edn_parser.cc"
|
3270
|
+
switch( (*p) ) {
|
3271
|
+
case 10: goto tr6;
|
3272
|
+
case 32: goto st4;
|
3273
|
+
case 44: goto st4;
|
3274
|
+
case 59: goto st2;
|
3275
|
+
}
|
3276
|
+
if ( 9 <= (*p) && (*p) <= 13 )
|
3277
|
+
goto st4;
|
3278
|
+
goto st0;
|
3279
|
+
st2:
|
3280
|
+
if ( ++p == pe )
|
3281
|
+
goto _test_eof2;
|
3282
|
+
case 2:
|
3283
|
+
if ( (*p) == 10 )
|
3284
|
+
goto tr6;
|
3285
|
+
goto st2;
|
3286
|
+
st3:
|
3287
|
+
if ( ++p == pe )
|
3288
|
+
goto _test_eof3;
|
3289
|
+
case 3:
|
3290
|
+
if ( (*p) == 10 )
|
3291
|
+
goto tr2;
|
3292
|
+
goto st3;
|
3293
|
+
}
|
3294
|
+
_test_eof1: cs = 1; goto _test_eof;
|
3295
|
+
_test_eof4: cs = 4; goto _test_eof;
|
3296
|
+
_test_eof2: cs = 2; goto _test_eof;
|
3297
|
+
_test_eof3: cs = 3; goto _test_eof;
|
3298
|
+
|
3299
|
+
_test_eof: {}
|
3300
|
+
_out: {}
|
3301
|
+
}
|
3302
|
+
|
3303
|
+
#line 1025 "edn_parser.rl"
|
3304
|
+
|
3305
|
+
if (cs == EDN_tokens_en_main) {} // silence ragel warning
|
3306
|
+
|
3185
3307
|
return result;
|
3186
3308
|
}
|
3187
3309
|
|
3310
|
+
|
3188
3311
|
/*
|
3189
3312
|
* Local variables:
|
3190
3313
|
* mode: c
|