RbYAML 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/lib/rbyaml.rb +14 -256
  2. data/lib/rbyaml.rb.~1.2.~ +383 -0
  3. data/lib/rbyaml/composer.rb +9 -11
  4. data/lib/rbyaml/{composer.rb.~1.2.~ → composer.rb.~1.3.~} +28 -25
  5. data/lib/rbyaml/constants.rb +95 -0
  6. data/lib/rbyaml/constructor.rb +180 -89
  7. data/lib/rbyaml/{constructor.rb.~1.2.~ → constructor.rb.~1.9.~} +137 -95
  8. data/lib/rbyaml/dumper.rb +12 -9
  9. data/lib/rbyaml/dumper.rb.~1.3.~ +36 -0
  10. data/lib/rbyaml/emitter.rb +14 -28
  11. data/lib/rbyaml/{emitter.rb.~1.2.~ → emitter.rb.~1.6.~} +22 -33
  12. data/lib/rbyaml/error.rb +4 -57
  13. data/lib/rbyaml/error.rb.~1.2.~ +75 -0
  14. data/lib/rbyaml/events.rb +8 -14
  15. data/lib/rbyaml/{events.rb.~1.2.~ → events.rb.~1.4.~} +29 -6
  16. data/lib/rbyaml/nodes.rb +5 -5
  17. data/lib/rbyaml/{nodes.rb.~1.2.~ → nodes.rb.~1.3.~} +13 -9
  18. data/lib/rbyaml/parser.rb +70 -108
  19. data/lib/rbyaml/parser.rb.~1.4.~ +632 -0
  20. data/lib/rbyaml/representer.rb +19 -157
  21. data/lib/rbyaml/representer.rb.old +317 -0
  22. data/lib/rbyaml/{representer.rb.~1.2.~ → representer.rb.~1.5.~} +60 -26
  23. data/lib/rbyaml/resolver.rb +6 -6
  24. data/lib/rbyaml/{resolver.rb.~1.1.~ → resolver.rb.~1.6.~} +20 -20
  25. data/lib/rbyaml/rubytypes.rb +391 -0
  26. data/lib/rbyaml/scanner.rb +123 -225
  27. data/lib/rbyaml/{scanner.rb.~1.2.~ → scanner.rb.~1.5.~} +466 -378
  28. data/lib/rbyaml/serializer.rb +9 -9
  29. data/lib/rbyaml/{serializer.rb.~1.2.~ → serializer.rb.~1.4.~} +19 -17
  30. data/lib/rbyaml/stream.rb +48 -0
  31. data/lib/rbyaml/tag.rb +72 -0
  32. data/lib/rbyaml/tokens.rb +22 -16
  33. data/lib/rbyaml/{tokens.rb.~1.2.~ → tokens.rb.~1.3.~} +44 -4
  34. data/lib/rbyaml/types.rb +146 -0
  35. data/lib/rbyaml/util.rb.~1.3.~ +38 -0
  36. data/lib/rbyaml/yaml.rb +22 -32
  37. data/lib/rbyaml/{yaml.rb.~1.2.~ → yaml.rb.~1.5.~} +17 -17
  38. data/test/load_one.rb +6 -0
  39. data/test/load_one_yaml.rb +6 -0
  40. data/test/output_events.rb +9 -0
  41. data/test/test_add_ctor.rb +51 -0
  42. data/test/test_add_ctor.rb.~1.1.~ +30 -0
  43. data/test/test_bm.rb +2 -2
  44. data/test/test_bm.rb.~1.1.~ +28 -0
  45. data/test/test_gems.rb +10 -0
  46. data/test/test_one.rb.~1.1.~ +5 -0
  47. data/test/test_one_syck.rb +5 -0
  48. data/test/test_rbyaml.rb +63 -32
  49. data/test/test_rbyaml.rb.~1.6.~ +59 -0
  50. data/test/{test_rbyaml.rb.~1.2.~ → test_rbyaml_old.rb} +13 -4
  51. data/test/test_time_events.rb +24 -0
  52. data/test/test_time_nodes.rb +24 -0
  53. data/test/test_time_tokens.rb +24 -0
  54. data/test/yaml/gems_new.yml +147456 -0
  55. data/test/yaml/test1.rb +8 -0
  56. data/test/yaml/test10.rb +14 -0
  57. data/test/yaml/test11.rb +13 -0
  58. data/test/yaml/test12.rb +9 -0
  59. data/test/yaml/test13.rb +9 -0
  60. data/test/yaml/test14.rb +13 -0
  61. data/test/yaml/test15.rb +12 -0
  62. data/test/yaml/test16.rb +11 -0
  63. data/test/yaml/test16.rb.~1.1.~ +11 -0
  64. data/test/yaml/test17.rb +10 -0
  65. data/test/yaml/test18.rb +13 -0
  66. data/test/yaml/test19.rb +9 -0
  67. data/test/yaml/test19.yml +1 -1
  68. data/test/yaml/test2.rb +8 -0
  69. data/test/yaml/test20.rb +11 -0
  70. data/test/yaml/test20.rb.~1.1.~ +9 -0
  71. data/test/yaml/test20.yml +1 -1
  72. data/test/yaml/test3.rb +13 -0
  73. data/test/yaml/test4.rb +13 -0
  74. data/test/yaml/test5.rb +8 -0
  75. data/test/yaml/test6.rb +10 -0
  76. data/test/yaml/test7.rb +15 -0
  77. data/test/yaml/test8.rb +15 -0
  78. data/test/yaml/test9.rb +13 -0
  79. metadata +61 -16
  80. data/lib/rbyaml/dumper.rb.~1.2.~ +0 -43
  81. data/lib/rbyaml/parser.rb.~1.2.~ +0 -494
@@ -0,0 +1,632 @@
1
+
2
+ # YAML can be parsed by an LL(1) parser!
3
+ #
4
+ # We use the following production rules:
5
+ # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
6
+ # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END?
7
+ # implicit_document ::= block_node DOCUMENT-END?
8
+ # block_node ::= ALIAS | properties? block_content
9
+ # flow_node ::= ALIAS | properties? flow_content
10
+ # properties ::= TAG ANCHOR? | ANCHOR TAG?
11
+ # block_content ::= block_collection | flow_collection | SCALAR
12
+ # flow_content ::= flow_collection | SCALAR
13
+ # block_collection ::= block_sequence | block_mapping
14
+ # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
15
+ # block_mapping ::= BLOCK-MAPPING_START ((KEY block_node_or_indentless_sequence?)? (VALUE block_node_or_indentless_sequence?)?)* BLOCK-END
16
+ # block_node_or_indentless_sequence ::= ALIAS | properties? (block_content | indentless_block_sequence)
17
+ # indentless_block_sequence ::= (BLOCK-ENTRY block_node?)+
18
+ # flow_collection ::= flow_sequence | flow_mapping
19
+ # flow_sequence ::= FLOW-SEQUENCE-START (flow_sequence_entry FLOW-ENTRY)* flow_sequence_entry? FLOW-SEQUENCE-END
20
+ # flow_mapping ::= FLOW-MAPPING-START (flow_mapping_entry FLOW-ENTRY)* flow_mapping_entry? FLOW-MAPPING-END
21
+ # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
22
+ # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
23
+
24
+ # TODO: support for BOM within a stream.
25
+ # stream ::= (BOM? implicit_document)? (BOM? explicit_document)* STREAM-END
26
+
27
+ # FIRST sets:
28
+ # stream: { STREAM-START }
29
+ # explicit_document: { DIRECTIVE DOCUMENT-START }
30
+ # implicit_document: FIRST(block_node)
31
+ # block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START }
32
+ # flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START }
33
+ # block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR }
34
+ # flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR }
35
+ # block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START }
36
+ # flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START }
37
+ # block_sequence: { BLOCK-SEQUENCE-START }
38
+ # block_mapping: { BLOCK-MAPPING-START }
39
+ # block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY }
40
+ # indentless_sequence: { ENTRY }
41
+ # flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START }
42
+ # flow_sequence: { FLOW-SEQUENCE-START }
43
+ # flow_mapping: { FLOW-MAPPING-START }
44
+ # flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY }
45
+ # flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY }
46
+
47
+ require 'rbyaml/error'
48
+ require 'rbyaml/tokens'
49
+ require 'rbyaml/events'
50
+ require 'rbyaml/scanner'
51
+
52
+ module RbYAML
53
+ class ParserError < MarkedYAMLError
54
+ end
55
+
56
+ class Parser
57
+ DEFAULT_TAGS = {
58
+ '!' => '!',
59
+ '!!' => 'tag:yaml.org,2002:'
60
+ }
61
+
62
+ def initialize(scanner)
63
+ @scanner = scanner
64
+ @current_event = nil
65
+ @yaml_version = nil
66
+ @events = nil
67
+ @working_events = nil
68
+ @tag_handles = { }
69
+ @parse_stack = nil
70
+ @start_mark = []
71
+ @tks = []
72
+
73
+ end
74
+
75
+ def check_event(*choices)
76
+ parse_stream
77
+ @current_event = parse_stream_next if @current_event.nil?
78
+ if @current_event
79
+ return true if choices.empty?
80
+ for choice in choices
81
+ return true if choice === @current_event
82
+ end
83
+ end
84
+ false
85
+ end
86
+
87
+ def peek_event
88
+ parse_stream
89
+ @current_event = parse_stream_next unless @current_event
90
+ @current_event
91
+ end
92
+
93
+ def get_event
94
+ parse_stream
95
+ @current_event = parse_stream_next unless @current_event
96
+ value = @current_event
97
+ @current_event = nil
98
+ value
99
+ end
100
+
101
+ def each_event
102
+ parse_stream
103
+ while @current_event = parse_stream_next
104
+ yield @current_event
105
+ end
106
+ end
107
+
108
+ def parse_stream
109
+ if !@parse_stack
110
+ @parse_stack = [:stream]
111
+ @tokens = nil
112
+ @tags = []
113
+ @anchors = []
114
+ @start_marks = []
115
+ @end_marks = []
116
+ end
117
+ end
118
+
119
+ def parse_stream_next
120
+ if !@parse_stack.empty?
121
+ while true
122
+ meth = @parse_stack.pop
123
+ #puts "our method: :#{meth}"
124
+ #puts "--- with peeked: :#{@scanner.peek_token.class} #{if @scanner.peek_token.respond_to?(:value): @scanner.peek_token.value.inspect; end}"
125
+ val = send(meth)
126
+ if !val.nil?
127
+ #puts "returning: #{val}"
128
+ return val
129
+ end
130
+ end
131
+ else
132
+ @tokens = nil
133
+ @tags = []
134
+ @anchors = []
135
+ @start_marks = []
136
+ @end_marks = []
137
+ return nil
138
+ end
139
+ end
140
+
141
+ #TERMINALS, definitions
142
+
143
+ def stream_start
144
+ token = @scanner.get_token
145
+ StreamStartEvent.new(token.start_mark, token.end_mark,token.encoding)
146
+ end
147
+
148
+ def stream_end
149
+ token = @scanner.get_token
150
+ StreamEndEvent.new(token.start_mark, token.end_mark)
151
+ end
152
+
153
+ def document_start_implicit
154
+ token = @scanner.peek_token
155
+ version, tags = process_directives
156
+ DocumentStartEvent.new(token.start_mark,token.start_mark,false,version,tags)
157
+ end
158
+
159
+ def document_start
160
+ token = @scanner.peek_token
161
+ start_mark = token.start_mark
162
+ version, tags = process_directives
163
+ raise ParserError.new(nil, nil,"expected '<document start>', but found #{token.tid}",token.start_mark) unless @scanner.peek_token.__is_document_start
164
+ @token = token = @scanner.get_token
165
+ end_mark = token.end_mark
166
+ DocumentStartEvent.new(start_mark, end_mark,true,version,tags)
167
+ end
168
+
169
+ def document_end
170
+ token = @scanner.peek_token
171
+ start_mark = end_mark = token.start_mark
172
+ explicit = false
173
+ while @scanner.peek_token.__is_document_end
174
+ @tokens = token = @scanner.get_token
175
+ end_mark = token.end_mark
176
+ explicit = true
177
+ end
178
+ DocumentEndEvent.new(start_mark, end_mark, explicit)
179
+ end
180
+
181
+ def _alias
182
+ token = @scanner.get_token
183
+ AliasEvent.new(token.value, token.start_mark, token.end_mark)
184
+ end
185
+
186
+ def block_sequence_start
187
+ end_mark = @scanner.peek_token.start_mark
188
+ implicit = @tags.last.nil? || @tags.last == "!"
189
+ @tokens = token = @scanner.get_token
190
+ SequenceStartEvent.new(@anchors.last, @tags.last, implicit, @start_marks.last, end_mark,false)
191
+ end
192
+
193
+ def block_indentless_sequence_start
194
+ end_mark = @scanner.peek_token.end_mark
195
+ implicit = @tags.last.nil? || @tags.last == "!"
196
+ SequenceStartEvent.new(@anchors.last, @tags.last, implicit, @start_marks.last, end_mark,false)
197
+ end
198
+
199
+ def block_sequence_end
200
+ if !@scanner.peek_token.__is_block_end
201
+ token = @scanner.peek_token
202
+ raise ParserError.new("while scanning a block collection", @start_marks.last,"expected <block end>, but found #{token.tid}: #{token.inspect}", token.start_mark)
203
+ end
204
+ token = @scanner.get_token
205
+ SequenceEndEvent.new(token.start_mark, token.end_mark)
206
+ end
207
+
208
+ def block_indentless_sequence_end
209
+ @tokens = token = @scanner.peek_token
210
+ SequenceEndEvent.new(token.start_mark, token.end_mark)
211
+ end
212
+
213
+ def block_mapping_start
214
+ end_mark = @scanner.peek_token.start_mark
215
+ implicit = @tags.last.nil? || @tags.last == "!"
216
+ @tokens = token = @scanner.get_token
217
+ MappingStartEvent.new(@anchors.last, @tags.last, implicit, @start_marks.last, end_mark,false)
218
+ end
219
+
220
+ def block_mapping_end
221
+ if !@scanner.peek_token.__is_block_end
222
+ token = @scanner.peek_token
223
+ raise ParserError.new("while scanning a block mapping", @start_marks.last,"expected <block end>, but found #{token.tid}", token.start_mark)
224
+ end
225
+ @tokens = token = @scanner.get_token
226
+ MappingEndEvent.new(token.start_mark, token.end_mark)
227
+ end
228
+
229
+ def flow_sequence_start
230
+ end_mark = @scanner.peek_token.end_mark
231
+ implicit = @tags.last.nil? || @tags.last == "!"
232
+ @tokens = token = @scanner.get_token
233
+ SequenceStartEvent.new(@anchors.last, @tags.last, implicit, @start_marks.last, end_mark,true)
234
+ end
235
+
236
+ def flow_sequence_end
237
+ @tokens = token = @scanner.get_token
238
+ SequenceEndEvent.new(token.start_mark, token.end_mark)
239
+ end
240
+
241
+ def flow_internal_mapping_start
242
+ @tokens = token = @scanner.get_token
243
+ MappingStartEvent.new(nil,nil,true,token.start_mark, token.end_mark,true)
244
+ end
245
+
246
+ def flow_internal_mapping_end
247
+ token = @scanner.peek_token
248
+ MappingEndEvent.new(token.start_mark, token.start_mark)
249
+ end
250
+
251
+ def flow_mapping_start
252
+ end_mark = @scanner.peek_token.end_mark
253
+ implicit = @tags.last.nil? || @tags.last == "!"
254
+ @tokens = token = @scanner.get_token
255
+ MappingStartEvent.new(@anchors.last, @tags.last, implicit, @start_marks.last, end_mark,true)
256
+ end
257
+
258
+ def flow_mapping_end
259
+ @tokens = token = @scanner.get_token
260
+ MappingEndEvent.new(token.start_mark, token.end_mark)
261
+ end
262
+
263
+ def scalar
264
+ token = @scanner.get_token
265
+ end_mark = token.end_mark
266
+ if (token.plain && @tags.last.nil?) || @tags.last == "!"
267
+ implicit = [true, false]
268
+ elsif @tags.last.nil?
269
+ implicit = [false, true]
270
+ else
271
+ implicit = [false, false]
272
+ end
273
+ ScalarEvent.new(@anchors.last, @tags.last, implicit, token.value, @start_marks.last, end_mark, token.style)
274
+ end
275
+
276
+ def empty_scalar
277
+ process_empty_scalar(@tokens.end_mark)
278
+ end
279
+
280
+
281
+ # PRODUCTIONS
282
+ def stream
283
+ @parse_stack += [:stream_end, :explicit_document, :implicit_document]
284
+ stream_start
285
+ end
286
+
287
+ def implicit_document
288
+ curr = @scanner.peek_token
289
+ unless curr.__is_directive || curr.__is_document_start || curr.__is_stream_end
290
+ @parse_stack += [:document_end, :block_node]
291
+ return document_start_implicit
292
+ end
293
+ nil
294
+ end
295
+
296
+ def explicit_document
297
+ if !@scanner.peek_token.__is_stream_end
298
+ @parse_stack += [:explicit_document, :document_end, :block_node]
299
+ return document_start
300
+ end
301
+ nil
302
+ end
303
+
304
+ def block_node
305
+ curr = @scanner.peek_token
306
+ if curr.__is_directive || curr.__is_document_start || curr.__is_document_end || curr.__is_stream_end
307
+ return empty_scalar
308
+ else
309
+ if curr.__is_alias
310
+ return _alias
311
+ else
312
+ @parse_stack << :un_properties
313
+ properties
314
+ return block_content
315
+ end
316
+ end
317
+ end
318
+
319
+ def flow_node
320
+ if @scanner.peek_token.__is_alias
321
+ return _alias
322
+ else
323
+ @parse_stack << :un_properties
324
+ properties
325
+ return flow_content
326
+ end
327
+ end
328
+
329
+ def properties
330
+ anchor = nil
331
+ tag = nil
332
+ start_mark = end_mark = tag_mark = nil
333
+ if @scanner.peek_token.__is_anchor
334
+ token = @scanner.get_token
335
+ start_mark = token.start_mark
336
+ end_mark = token.end_mark
337
+ anchor = token.value
338
+ if @scanner.peek_token.__is_tag
339
+ token = @scanner.get_token
340
+ tag_mark = token.start_mark
341
+ end_mark = token.end_mark
342
+ tag = token.value
343
+ end
344
+ elsif @scanner.peek_token.__is_tag
345
+ token = @scanner.get_token
346
+ start_mark = tag_mark = token.start_mark
347
+ end_mark = token.end_mark
348
+ tag = token.value
349
+ if @scanner.peek_token.__is_anchor
350
+ token = @scanner.get_token
351
+ end_mark = token.end_mark
352
+ anchor = token.value
353
+ end
354
+ end
355
+
356
+ if !tag.nil? and tag != "!"
357
+ handle, suffix = tag
358
+ if !handle.nil?
359
+ raise ParserError.new("while parsing a node", start_mark,"found undefined tag handle #{handle}",tag_mark) if !@tag_handles.include?(handle)
360
+ tag = @tag_handles[handle]+suffix
361
+ else
362
+ tag = suffix
363
+ end
364
+ end
365
+ if start_mark.nil?
366
+ start_mark = end_mark = @scanner.peek_token.start_mark
367
+ end
368
+ @anchors << anchor
369
+ @tags << tag
370
+ @start_marks << start_mark
371
+ @end_marks << end_mark
372
+ nil
373
+ end
374
+
375
+ def un_properties
376
+ @anchors.pop
377
+ @tags.pop
378
+ @start_marks.pop
379
+ @end_marks.pop
380
+ nil
381
+ end
382
+
383
+ def block_content
384
+ token = @scanner.peek_token
385
+ if token.__is_block_sequence_start
386
+ return block_sequence
387
+ elsif token.__is_block_mapping_start
388
+ return block_mapping
389
+ elsif token.__is_flow_sequence_start
390
+ return flow_sequence
391
+ elsif token.__is_flow_mapping_start
392
+ return flow_mapping
393
+ elsif token.__is_scalar
394
+ return scalar
395
+ else
396
+ raise ParserError.new("while scanning a node", @start_marks.last,"expected the node content, but found #{token.tid}",token.start_mark)
397
+ end
398
+ end
399
+
400
+ def flow_content
401
+ token = @scanner.peek_token
402
+ if token.__is_flow_sequence_start
403
+ return flow_sequence
404
+ elsif token.__is_flow_mapping_start
405
+ return flow_mapping
406
+ elsif token.__is_scalar
407
+ return scalar
408
+ else
409
+ raise ParserError.new("while scanning a flow node", @start_marks.last,"expected the node content, but found #{token.tid}",token.start_mark)
410
+ end
411
+ end
412
+
413
+ def block_sequence_entry
414
+ if @scanner.peek_token.__is_block_entry
415
+ @tokens = token = @scanner.get_token
416
+ if !(@scanner.peek_token.__is_block_entry || @scanner.peek_token.__is_block_end)
417
+ @parse_stack += [:block_sequence_entry]
418
+ return block_node
419
+ else
420
+ @parse_steck += [:block_sequence_entry]
421
+ return empty_scalar
422
+ end
423
+ end
424
+ nil
425
+ end
426
+
427
+ def block_mapping_entry
428
+ # ((KEY block_node_or_indentless_sequence?)? (VALUE block_node_or_indentless_sequence?)?)*
429
+ if @scanner.peek_token.__is_key || @scanner.peek_token.__is_value
430
+ if @scanner.check_token(KeyToken)
431
+ @tokens = token = @scanner.get_token
432
+ curr = @scanner.peek_token
433
+ if !(curr.__is_key || curr.__is_value || curr.__is_block_end)
434
+ @parse_stack += [:block_mapping_entry,:block_mapping_entry_value]
435
+ return block_node_or_indentless_sequence
436
+ else
437
+ @parse_stack += [:block_mapping_entry,:block_mapping_entry_value]
438
+ return empty_scalar
439
+ end
440
+ else
441
+ @parse_stack += [:block_mapping_entry,:block_mapping_entry_value]
442
+ return empty_scalar
443
+ end
444
+ end
445
+ nil
446
+ end
447
+
448
+ def block_mapping_entry_value
449
+ if @scanner.peek_token.__is_key || @scanner.peek_token.__is_value
450
+ if @scanner.peek_token.__is_value
451
+ @tokens = token = @scanner.get_token
452
+ curr = @scanner.peek_token
453
+ if !(curr.__is_key || curr.__is_value || curr.__is_block_end)
454
+ return block_node_or_indentless_sequence
455
+ else
456
+ return empty_scalar
457
+ end
458
+ else
459
+ @tokens = token = @scanner.peek_token
460
+ return empty_scalar
461
+ end
462
+ end
463
+ nil
464
+ end
465
+
466
+ def block_sequence
467
+ @parse_stack += [:block_sequence_end,:block_sequence_entry]
468
+ block_sequence_start
469
+ end
470
+
471
+ def block_mapping
472
+ @parse_stack += [:block_mapping_end,:block_mapping_entry]
473
+ block_mapping_start
474
+ end
475
+
476
+ def block_node_or_indentless_sequence
477
+ if @scanner.peek_token.__is_alias
478
+ return _alias
479
+ else
480
+ if @scanner.peek_token.__is_block_entry
481
+ properties
482
+ return indentless_block_sequence
483
+ else
484
+ properties
485
+ return block_content
486
+ end
487
+ end
488
+ end
489
+
490
+ def indentless_block_sequence
491
+ @parse_stack += [:block_indentless_sequence_end,:indentless_block_sequence_entry]
492
+ block_indentless_sequence_start
493
+ end
494
+
495
+ def indentless_block_sequence_entry
496
+ if @scanner.peek_token.__is_block_entry
497
+ @tokens = @scanner.get_token
498
+ curr = @scanner.peek_token
499
+ if !(curr.__is_block_entry || curr.__is_key || curr.__is_value || curr.__is_block_end)
500
+ @parse_stack << :indentless_block_sequence_entry
501
+ return block_node
502
+ else
503
+ @parse_stack << :indentless_block_sequence_entry
504
+ return empty_scalar
505
+ end
506
+ end
507
+ nil
508
+ end
509
+
510
+ def flow_sequence
511
+ @parse_stack += [:flow_sequence_end,:flow_sequence_entry]
512
+ flow_sequence_start
513
+ end
514
+
515
+ def flow_mapping
516
+ @parse_stack += [:flow_mapping_end,:flow_mapping_entry]
517
+ flow_mapping_start
518
+ end
519
+
520
+ def flow_sequence_entry
521
+ if !@scanner.peek_token.__is_flow_sequence_end
522
+ if @scanner.peek_token.__is_key
523
+ @parse_stack += [:flow_sequence_entry,:flow_entry_marker,:flow_internal_mapping_end,:flow_internal_value,:flow_internal_content]
524
+ return flow_internal_mapping_start
525
+ else
526
+ @parse_stack += [:flow_sequence_entry,:flow_node]
527
+ return flow_entry_marker
528
+ end
529
+ end
530
+ nil
531
+ end
532
+
533
+ def flow_internal_content
534
+ token = @scanner.peek_token
535
+ if !(token.__is_value || token.__is_flow_entry || token.__is_flow_sequence_end)
536
+ flow_node
537
+ else
538
+ empty_scalar
539
+ end
540
+ end
541
+
542
+ def flow_internal_value
543
+ if @scanner.peek_token.__is_value
544
+ @tokens = token = @scanner.get_token
545
+ if !(@scanner.peek_token.__is_flow_entry || @scanner.peek_token.__is_flow_sequence_end)
546
+ flow_node
547
+ else
548
+ empty_scalar
549
+ end
550
+ else
551
+ @tokens = token = @scanner.peek_token
552
+ empty_scalar
553
+ end
554
+ end
555
+
556
+ def flow_entry_marker
557
+ if @scanner.peek_token.__is_flow_entry
558
+ @scanner.get_token
559
+ end
560
+ nil
561
+ end
562
+
563
+ def flow_mapping_entry
564
+ if !@scanner.peek_token.__is_flow_mapping_end
565
+ if @scanner.peek_token.__is_key
566
+ @parse_stack += [:flow_mapping_entry,:flow_entry_marker,:flow_mapping_internal_value]
567
+ return flow_mapping_internal_content
568
+ else
569
+ @parse_stack += [:flow_mapping_entry,:flow_node]
570
+ return flow_entry_marker
571
+ end
572
+ end
573
+ nil
574
+ end
575
+
576
+ def flow_mapping_internal_content
577
+ curr = @scanner.peek_token
578
+ if !(curr.__is_value || curr.__is_flow_entry || curr.__is_flow_mapping_end)
579
+ @tokens = token = @scanner.get_token
580
+ flow_node
581
+ else
582
+ empty_scalar
583
+ end
584
+ end
585
+
586
+ def flow_mapping_internal_value
587
+ if @scanner.peek_token.__is_value
588
+ @tokens = token = @scanner.get_token
589
+ if !(@scanner.peek_token.__is_flow_entry || @scanner.peek_token.__is_flow_mapping_end)
590
+ flow_node
591
+ else
592
+ empty_scalar
593
+ end
594
+ else
595
+ @tokens = token = @scanner.peek_token
596
+ empty_scalar
597
+ end
598
+ end
599
+
600
+
601
+ def process_directives
602
+ # DIRECTIVE*
603
+ while @scanner.peek_token.__is_directive
604
+ token = @scanner.get_token
605
+ if token.name == "YAML"
606
+ raise ParserError.new(nil, nil,"found duplicate YAML directive", token.start_mark) if !@yaml_version.nil?
607
+ major, minor = token.value[0].to_i, token.value[1].to_i
608
+ raise ParserError.new(nil,nil,"found incompatible YAML document (version 1.* is required)",token.start_mark) if major != 1
609
+ @yaml_version = [major,minor]
610
+ elsif token.name == "TAG"
611
+ handle, prefix = token.value
612
+ raise ParserError.new(nil,nil,"duplicate tag handle #{handle}",token.start_mark) if @tag_handles.member?(handle)
613
+ @tag_handles[handle] = prefix
614
+ end
615
+ end
616
+ if !@tag_handles.empty?
617
+ value = @yaml_version, @tag_handles.dup
618
+ else
619
+ value = @yaml_version, nil
620
+ end
621
+ for key in DEFAULT_TAGS.keys
622
+ @tag_handles[key] = DEFAULT_TAGS[key] if !@tag_handles.include?(key)
623
+ end
624
+ value
625
+ end
626
+
627
+ def process_empty_scalar(mark)
628
+ ScalarEvent.new(nil, nil, [true, false], "", mark, mark)
629
+ end
630
+ end
631
+ end
632
+