jiffy 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +27 -28
  5. data/Rakefile +17 -0
  6. data/bin/jiffy +28 -3
  7. data/jiffy.gemspec +15 -66
  8. data/lib/jiffy.rb +27 -27
  9. data/lib/jiffy/array_mimicking_io.rb +1 -1
  10. data/lib/jiffy/outputter.rb +85 -0
  11. data/lib/jiffy/outputters/json.rb +35 -0
  12. data/lib/jiffy/outputters/ruby.rb +35 -0
  13. data/lib/jiffy/parser.rb +17 -0
  14. data/lib/jiffy/parsers/json.rb +18 -42
  15. data/lib/jiffy/parsers/json.rl +10 -22
  16. data/lib/jiffy/parsers/json_array.rb +22 -29
  17. data/lib/jiffy/parsers/json_array.rl +11 -12
  18. data/lib/jiffy/parsers/json_float.rb +39 -21
  19. data/lib/jiffy/parsers/json_float.rl +15 -7
  20. data/lib/jiffy/parsers/json_object.rb +30 -49
  21. data/lib/jiffy/parsers/json_object.rl +13 -20
  22. data/lib/jiffy/parsers/json_string.rb +70 -27
  23. data/lib/jiffy/parsers/json_string.rl +21 -6
  24. data/lib/jiffy/parsers/json_value.rb +33 -52
  25. data/lib/jiffy/parsers/json_value.rl +15 -34
  26. data/lib/jiffy/version.rb +1 -1
  27. data/test/jiffy_test.rb +261 -34
  28. data/test/outputter_test.rb +155 -0
  29. data/test/outputters/json_test.rb +22 -0
  30. metadata +9 -60
  31. data/lib/jiffy/json_outputter.rb +0 -62
  32. data/test/negative-examples/hexadecimal.json +0 -3
  33. data/test/negative-examples/infinity-value.json +0 -3
  34. data/test/negative-examples/leading-comma.json +0 -3
  35. data/test/negative-examples/leading-zero.json +0 -3
  36. data/test/negative-examples/line-break.json +0 -4
  37. data/test/negative-examples/missing-colon.json +0 -3
  38. data/test/negative-examples/nan-value,json +0 -3
  39. data/test/negative-examples/positive-float.json +0 -3
  40. data/test/negative-examples/positive-integer.json +0 -3
  41. data/test/negative-examples/single-quote.json +0 -3
  42. data/test/negative-examples/string-as-root.json +0 -1
  43. data/test/negative-examples/tab-character.json +0 -3
  44. data/test/negative-examples/trailing-array-seperator.json +0 -3
  45. data/test/negative-examples/trailing-object-seperator.json +0 -3
  46. data/test/negative-examples/true-as-root.json +0 -1
  47. data/test/negative-examples/unclosed-array.json +0 -2
  48. data/test/negative-examples/unclosed-object.json +0 -2
  49. data/test/positive-examples/array-as-root.json +0 -3
  50. data/test/positive-examples/array-nested-inside-array.json +0 -5
  51. data/test/positive-examples/array-nested-inside-object.json +0 -5
  52. data/test/positive-examples/false-value.json +0 -3
  53. data/test/positive-examples/null-value.json +0 -3
  54. data/test/positive-examples/number-1.json +0 -3
  55. data/test/positive-examples/number-10.json +0 -3
  56. data/test/positive-examples/number-11.json +0 -3
  57. data/test/positive-examples/number-12.json +0 -3
  58. data/test/positive-examples/number-13.json +0 -3
  59. data/test/positive-examples/number-14.json +0 -3
  60. data/test/positive-examples/number-15.json +0 -3
  61. data/test/positive-examples/number-16.json +0 -3
  62. data/test/positive-examples/number-17.json +0 -3
  63. data/test/positive-examples/number-18.json +0 -3
  64. data/test/positive-examples/number-19.json +0 -3
  65. data/test/positive-examples/number-2.json +0 -3
  66. data/test/positive-examples/number-20.json +0 -3
  67. data/test/positive-examples/number-3.json +0 -3
  68. data/test/positive-examples/number-4.json +0 -3
  69. data/test/positive-examples/number-5.json +0 -3
  70. data/test/positive-examples/number-6.json +0 -3
  71. data/test/positive-examples/number-7.json +0 -3
  72. data/test/positive-examples/number-8.json +0 -3
  73. data/test/positive-examples/number-9.json +0 -3
  74. data/test/positive-examples/object-as-root.json +0 -3
  75. data/test/positive-examples/object-nested-inside-array.json +0 -5
  76. data/test/positive-examples/object-nested-inside-object.json +0 -5
  77. data/test/positive-examples/seperated-array-values.json +0 -4
  78. data/test/positive-examples/seperated-object-properties.json +0 -4
  79. data/test/positive-examples/string-backspace.json +0 -3
  80. data/test/positive-examples/string-carriage-return.json +0 -3
  81. data/test/positive-examples/string-formfeed.json +0 -3
  82. data/test/positive-examples/string-horizontal-tab.json +0 -3
  83. data/test/positive-examples/string-newline.json +0 -3
  84. data/test/positive-examples/string-quotation.json +0 -3
  85. data/test/positive-examples/string-reverse-solidus.json +0 -3
  86. data/test/positive-examples/string-solidus.json +0 -3
  87. data/test/positive-examples/string-trivial.json +0 -3
  88. data/test/positive-examples/string-unicode.json +0 -3
  89. data/test/positive-examples/true-value.json +0 -3
@@ -4,32 +4,40 @@
4
4
 
5
5
  action exit { fhold; fbreak; }
6
6
 
7
- action char { o.t :char, [data[p]].pack("c*") }
8
- action number { o.t :number, [data[p]].pack("c*").to_i }
7
+ action char { y << [:char, [data[p]].pack("c*")] }
8
+ action number { y << [:number, [data[p]].pack("c*").to_i] }
9
+ action exponent { y << :exponent }
10
+ action minus { y << :minus }
11
+ action plus { y << :plus }
9
12
 
10
- significand = '-'? @char ('0' >number | [1-9] >char [0-9]* $number) ('.' >char [0-9]+ $number)?;
13
+ significand = '-'? @minus ('0' >number | [1-9] >number [0-9]* $number) ('.' >char [0-9]+ $number)?;
11
14
 
12
- exponent = [Ee] >char [+\-]? @char [0-9]+ $number;
15
+ exponent = [Ee] >exponent ( '-' >minus | '+' >plus )? [0-9]+ $number;
13
16
 
14
17
  main := (significand exponent?) (^[0-9Ee.\-]? @exit );
15
18
  }%%
16
19
 
17
20
  class Jiffy
18
21
  module Parsers
19
- module JsonFloat
22
+ class JsonFloat < Parser
20
23
  def initialize(*args)
21
24
  %% write data;
25
+
22
26
  super
23
27
  end
24
28
 
25
- def parse_json_float(p, pe)
26
- t_p = p
29
+ def parse
30
+ pe = :ignored
31
+ eof = :ignored
32
+ p = self.p
27
33
 
28
34
  %% write init;
29
35
  %% write exec;
30
36
 
31
37
  if cs >= json_float_first_final
32
38
  p
39
+ else
40
+ raise_unparseable p
33
41
  end
34
42
  end
35
43
  end
@@ -1,12 +1,12 @@
1
1
 
2
2
  # line 1 "json_object.rl"
3
3
 
4
- # line 36 "json_object.rl"
4
+ # line 24 "json_object.rl"
5
5
 
6
6
 
7
7
  class Jiffy
8
8
  module Parsers
9
- module JsonObject
9
+ class JsonObject < Parser
10
10
  def initialize(*args)
11
11
 
12
12
  # line 13 "json_object.rb"
@@ -140,22 +140,27 @@ end
140
140
  self.json_object_en_main = 1;
141
141
 
142
142
 
143
- # line 43 "json_object.rl"
143
+ # line 31 "json_object.rl"
144
+
144
145
  super
145
146
  end
146
147
 
147
- def parse_json_object(p, pe)
148
+ def parse
149
+ pe = :ignored
150
+ eof = :ignored
151
+ p = self.p
152
+
148
153
 
149
- # line 150 "json_object.rb"
154
+ # line 155 "json_object.rb"
150
155
  begin
151
156
  p ||= 0
152
157
  pe ||= data.length
153
158
  cs = json_object_start
154
159
  end
155
160
 
156
- # line 48 "json_object.rl"
161
+ # line 41 "json_object.rl"
157
162
 
158
- # line 159 "json_object.rb"
163
+ # line 164 "json_object.rb"
159
164
  begin
160
165
  _klen, _trans, _keys, _acts, _nacts = nil
161
166
  _goto_level = 0
@@ -240,42 +245,18 @@ when 0 then
240
245
  # line 5 "json_object.rl"
241
246
  begin
242
247
 
243
- np = parse_json_value(p, pe)
244
-
245
- if np
246
- begin p = (( np))-1; end
247
-
248
- else
249
- p = p - 1; begin
250
- p += 1
251
- _trigger_goto = true
252
- _goto_level = _out
253
- break
254
- end
248
+ begin p = (( JsonValue.new(p: p, data: data, yielder: yielder).parse))-1; end
255
249
 
256
- end
257
250
  end
258
251
  when 1 then
259
- # line 15 "json_object.rl"
252
+ # line 9 "json_object.rl"
260
253
  begin
261
254
 
262
- np = parse_json_string(p, pe)
255
+ begin p = (( JsonString.new(p: p, data: data, yielder: yielder).parse))-1; end
263
256
 
264
- if np
265
- begin p = (( np))-1; end
266
-
267
- else
268
- p = p - 1; begin
269
- p += 1
270
- _trigger_goto = true
271
- _goto_level = _out
272
- break
273
- end
274
-
275
- end
276
257
  end
277
258
  when 2 then
278
- # line 25 "json_object.rl"
259
+ # line 13 "json_object.rl"
279
260
  begin
280
261
  p = p - 1; begin
281
262
  p += 1
@@ -285,30 +266,30 @@ when 2 then
285
266
  end
286
267
  end
287
268
  when 3 then
288
- # line 27 "json_object.rl"
269
+ # line 15 "json_object.rl"
289
270
  begin
290
- o.t :begin_string end
271
+ y << :begin_name end
291
272
  when 4 then
292
- # line 27 "json_object.rl"
273
+ # line 15 "json_object.rl"
293
274
  begin
294
- o.t :end_string end
275
+ y << :end_name end
295
276
  when 5 then
296
- # line 27 "json_object.rl"
277
+ # line 15 "json_object.rl"
297
278
  begin
298
- o.t :name_separator end
279
+ y << :name_separator end
299
280
  when 6 then
300
- # line 29 "json_object.rl"
281
+ # line 17 "json_object.rl"
301
282
  begin
302
- o.t :value_separator end
283
+ y << :value_separator end
303
284
  when 7 then
304
- # line 32 "json_object.rl"
285
+ # line 20 "json_object.rl"
305
286
  begin
306
- o.t :begin_object end
287
+ y << :begin_object end
307
288
  when 8 then
308
- # line 34 "json_object.rl"
289
+ # line 22 "json_object.rl"
309
290
  begin
310
- o.t :end_object end
311
- # line 312 "json_object.rb"
291
+ y << :end_object end
292
+ # line 293 "json_object.rb"
312
293
  end # action switch
313
294
  end
314
295
  end
@@ -335,7 +316,7 @@ when 8 then
335
316
  end
336
317
  end
337
318
 
338
- # line 49 "json_object.rl"
319
+ # line 42 "json_object.rl"
339
320
 
340
321
  if cs >= json_object_first_final
341
322
  p + 1
@@ -3,47 +3,40 @@
3
3
  include json_common "json_common.rl";
4
4
 
5
5
  action parse_value {
6
- np = parse_json_value(fpc, pe)
7
-
8
- if np
9
- fexec np;
10
- else
11
- fhold; fbreak;
12
- end
6
+ fexec JsonValue.new(p: p, data: data, yielder: yielder).parse;
13
7
  }
14
8
 
15
9
  action parse_name {
16
- np = parse_json_string(fpc, pe)
17
-
18
- if np
19
- fexec np;
20
- else
21
- fhold; fbreak;
22
- end
10
+ fexec JsonString.new(p: p, data: data, yielder: yielder).parse;
23
11
  }
24
12
 
25
13
  action exit { fhold; fbreak; }
26
14
 
27
- pair = ignore* begin_name >{ o.t :begin_string } >parse_name @{ o.t :end_string } ignore* name_separator >{ o.t :name_separator } ignore* begin_value >parse_value;
15
+ pair = ignore* begin_name >{ y << :begin_name } >parse_name @{ y << :end_name } ignore* name_separator >{ y << :name_separator } ignore* begin_value >parse_value;
28
16
 
29
- next_pair = ignore* value_separator >{ o.t :value_separator } pair;
17
+ next_pair = ignore* value_separator >{ y << :value_separator } pair;
30
18
 
31
19
  main := (
32
- begin_object >{ o.t :begin_object }
20
+ begin_object >{ y << :begin_object }
33
21
  (pair (next_pair)*)? ignore*
34
- end_object >{ o.t :end_object }
22
+ end_object >{ y << :end_object }
35
23
  ) @exit;
36
24
  }%%
37
25
 
38
26
  class Jiffy
39
27
  module Parsers
40
- module JsonObject
28
+ class JsonObject < Parser
41
29
  def initialize(*args)
42
30
  %% write data;
31
+
43
32
  super
44
33
  end
45
34
 
46
- def parse_json_object(p, pe)
35
+ def parse
36
+ pe = :ignored
37
+ eof = :ignored
38
+ p = self.p
39
+
47
40
  %% write init;
48
41
  %% write exec;
49
42
 
@@ -1,12 +1,12 @@
1
1
 
2
2
  # line 1 "json_string.rl"
3
3
 
4
- # line 17 "json_string.rl"
4
+ # line 29 "json_string.rl"
5
5
 
6
6
 
7
7
  class Jiffy
8
8
  module Parsers
9
- module JsonString
9
+ class JsonString < Parser
10
10
  def initialize(*args)
11
11
 
12
12
  # line 13 "json_string.rb"
@@ -15,7 +15,10 @@ class << self
15
15
  private :_json_string_actions, :_json_string_actions=
16
16
  end
17
17
  self._json_string_actions = [
18
- 0, 1, 0, 1, 1
18
+ 0, 1, 0, 1, 1, 1, 2, 1,
19
+ 3, 1, 4, 1, 5, 1, 6, 1,
20
+ 7, 1, 8, 1, 9, 1, 10, 1,
21
+ 11, 2, 11, 12
19
22
  ]
20
23
 
21
24
  class << self
@@ -66,25 +69,16 @@ self._json_string_index_offsets = [
66
69
  32
67
70
  ]
68
71
 
69
- class << self
70
- attr_accessor :_json_string_indicies
71
- private :_json_string_indicies, :_json_string_indicies=
72
- end
73
- self._json_string_indicies = [
74
- 0, 1, 3, 4, 1, 2, 2, 2,
75
- 2, 2, 2, 2, 2, 2, 5, 1,
76
- 6, 6, 6, 1, 7, 7, 7, 1,
77
- 8, 8, 8, 1, 2, 2, 2, 1,
78
- 1, 0
79
- ]
80
-
81
72
  class << self
82
73
  attr_accessor :_json_string_trans_targs
83
74
  private :_json_string_trans_targs, :_json_string_trans_targs=
84
75
  end
85
76
  self._json_string_trans_targs = [
86
- 2, 0, 2, 8, 3, 4, 5, 6,
87
- 7
77
+ 2, 0, 8, 3, 0, 2, 2, 2,
78
+ 2, 2, 2, 2, 2, 2, 4, 0,
79
+ 5, 5, 5, 0, 6, 6, 6, 0,
80
+ 7, 7, 7, 0, 2, 2, 2, 0,
81
+ 0, 0
88
82
  ]
89
83
 
90
84
  class << self
@@ -92,8 +86,11 @@ class << self
92
86
  private :_json_string_trans_actions, :_json_string_trans_actions=
93
87
  end
94
88
  self._json_string_trans_actions = [
95
- 0, 0, 3, 1, 3, 3, 3, 3,
96
- 3
89
+ 0, 0, 1, 21, 0, 3, 5, 9,
90
+ 7, 11, 13, 15, 17, 19, 0, 0,
91
+ 23, 23, 23, 0, 23, 23, 23, 0,
92
+ 23, 23, 23, 0, 25, 25, 25, 0,
93
+ 0, 0
97
94
  ]
98
95
 
99
96
  class << self
@@ -115,12 +112,15 @@ end
115
112
  self.json_string_en_main = 1;
116
113
 
117
114
 
118
- # line 24 "json_string.rl"
115
+ # line 36 "json_string.rl"
116
+
119
117
  super
120
118
  end
121
119
 
122
- def parse_json_string(p, pe)
123
- t_p = p + 1
120
+ def parse
121
+ pe = :ignored
122
+ eof = :ignored
123
+ p = self.p
124
124
 
125
125
 
126
126
  # line 127 "json_string.rb"
@@ -130,7 +130,7 @@ begin
130
130
  cs = json_string_start
131
131
  end
132
132
 
133
- # line 31 "json_string.rl"
133
+ # line 46 "json_string.rl"
134
134
 
135
135
  # line 136 "json_string.rb"
136
136
  begin
@@ -203,7 +203,6 @@ begin
203
203
  _trans += _klen
204
204
  end
205
205
  end while false
206
- _trans = _json_string_indicies[_trans]
207
206
  cs = _json_string_trans_targs[_trans]
208
207
  if _json_string_trans_actions[_trans] != 0
209
208
  _acts = _json_string_trans_actions[_trans]
@@ -226,8 +225,52 @@ when 0 then
226
225
  when 1 then
227
226
  # line 7 "json_string.rl"
228
227
  begin
229
- o.t :char, [data[p]].pack("c*") end
230
- # line 231 "json_string.rb"
228
+ y << [:char, [data[p]].pack("c*")] end
229
+ when 2 then
230
+ # line 13 "json_string.rl"
231
+ begin
232
+ y << :escaped_quotation_mark end
233
+ when 3 then
234
+ # line 14 "json_string.rl"
235
+ begin
236
+ y << :escaped_reverse_solidus end
237
+ when 4 then
238
+ # line 15 "json_string.rl"
239
+ begin
240
+ y << :escaped_solidus end
241
+ when 5 then
242
+ # line 16 "json_string.rl"
243
+ begin
244
+ y << :escaped_backspace end
245
+ when 6 then
246
+ # line 17 "json_string.rl"
247
+ begin
248
+ y << :escaped_formfeed end
249
+ when 7 then
250
+ # line 18 "json_string.rl"
251
+ begin
252
+ y << :escaped_newline end
253
+ when 8 then
254
+ # line 19 "json_string.rl"
255
+ begin
256
+ y << :escaped_carriage_return end
257
+ when 9 then
258
+ # line 20 "json_string.rl"
259
+ begin
260
+ y << :escaped_horizontal_tab end
261
+ when 10 then
262
+ # line 23 "json_string.rl"
263
+ begin
264
+ unicode_sequence = "" end
265
+ when 11 then
266
+ # line 23 "json_string.rl"
267
+ begin
268
+ unicode_sequence << [data[p]].pack("c*") end
269
+ when 12 then
270
+ # line 23 "json_string.rl"
271
+ begin
272
+ y << [:escaped_unicode, unicode_sequence.to_s] end
273
+ # line 274 "json_string.rb"
231
274
  end # action switch
232
275
  end
233
276
  end
@@ -254,7 +297,7 @@ when 1 then
254
297
  end
255
298
  end
256
299
 
257
- # line 32 "json_string.rl"
300
+ # line 47 "json_string.rl"
258
301
 
259
302
  if cs >= json_string_first_final
260
303
  p + 1
@@ -4,11 +4,23 @@
4
4
 
5
5
  action exit { fhold; fbreak; }
6
6
 
7
- action char { o.t :char, [data[p]].pack("c*") }
7
+ action char { y << [:char, [data[p]].pack("c*")] }
8
+ action unicode { y << [:unicode, data[(p-4)..p].pack("c*")] }
8
9
 
9
10
  character = ^([\"\\] | 0..0x1f) >char;
10
- sequence = '\\' >char [\"\\/bfnrt] >char;
11
- unicode = '\\' >char 'u' >char [0-9a-fA-F]{4} $char;
11
+
12
+ sequence = '\\' (
13
+ '"' >{ y << :escaped_quotation_mark } |
14
+ '\\' >{ y << :escaped_reverse_solidus } |
15
+ '/' >{ y << :escaped_solidus } |
16
+ 'b' >{ y << :escaped_backspace } |
17
+ 'f' >{ y << :escaped_formfeed } |
18
+ 'n' >{ y << :escaped_newline } |
19
+ 'r' >{ y << :escaped_carriage_return } |
20
+ 't' >{ y << :escaped_horizontal_tab }
21
+ );
22
+
23
+ unicode = '\\u' >{ unicode_sequence = "" } [0-9a-fA-F]{4} ${ unicode_sequence << [data[p]].pack("c*") } @{ y << [:escaped_unicode, unicode_sequence.to_s] };
12
24
 
13
25
  main := '"' (
14
26
  character | sequence | unicode
@@ -18,14 +30,17 @@
18
30
 
19
31
  class Jiffy
20
32
  module Parsers
21
- module JsonString
33
+ class JsonString < Parser
22
34
  def initialize(*args)
23
35
  %% write data;
36
+
24
37
  super
25
38
  end
26
39
 
27
- def parse_json_string(p, pe)
28
- t_p = p + 1
40
+ def parse
41
+ pe = :ignored
42
+ eof = :ignored
43
+ p = self.p
29
44
 
30
45
  %% write init;
31
46
  %% write exec;