7
// The parser implements the following grammar:
9
// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
10
// implicit_document ::= block_node DOCUMENT-END*
11
// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
12
// block_node_or_indentless_sequence ::=
14
// | properties (block_content | indentless_block_sequence)?
16
// | indentless_block_sequence
17
// block_node ::= ALIAS
18
// | properties block_content?
20
// flow_node ::= ALIAS
21
// | properties flow_content?
23
// properties ::= TAG ANCHOR? | ANCHOR TAG?
24
// block_content ::= block_collection | flow_collection | SCALAR
25
// flow_content ::= flow_collection | SCALAR
26
// block_collection ::= block_sequence | block_mapping
27
// flow_collection ::= flow_sequence | flow_mapping
28
// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
29
// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
30
// block_mapping ::= BLOCK-MAPPING_START
31
// ((KEY block_node_or_indentless_sequence?)?
32
// (VALUE block_node_or_indentless_sequence?)?)*
34
// flow_sequence ::= FLOW-SEQUENCE-START
35
// (flow_sequence_entry FLOW-ENTRY)*
36
// flow_sequence_entry?
38
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
39
// flow_mapping ::= FLOW-MAPPING-START
40
// (flow_mapping_entry FLOW-ENTRY)*
41
// flow_mapping_entry?
43
// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
45
// Peek the next token in the token queue.
46
func peek_token(parser *yaml_parser_t) *yaml_token_t {
47
if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
48
return &parser.tokens[parser.tokens_head]
53
// Remove the next token from the queue (must be called after peek_token).
54
func skip_token(parser *yaml_parser_t) {
55
parser.token_available = false
56
parser.tokens_parsed++
57
parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
61
// Get the next event.
62
func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
63
// Erase the event object.
64
*event = yaml_event_t{}
66
// No events after the end of the stream or error.
67
if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
71
// Generate the next event.
72
return yaml_parser_state_machine(parser, event)
76
func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
77
parser.error = yaml_PARSER_ERROR
78
parser.problem = problem
79
parser.problem_mark = problem_mark
83
func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool {
84
parser.error = yaml_PARSER_ERROR
85
parser.context = context
86
parser.context_mark = context_mark
87
parser.problem = problem
88
parser.problem_mark = problem_mark
93
func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
94
//trace("yaml_parser_state_machine", "state:", parser.state.String())
97
case yaml_PARSE_STREAM_START_STATE:
98
return yaml_parser_parse_stream_start(parser, event)
100
case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
101
return yaml_parser_parse_document_start(parser, event, true)
103
case yaml_PARSE_DOCUMENT_START_STATE:
104
return yaml_parser_parse_document_start(parser, event, false)
106
case yaml_PARSE_DOCUMENT_CONTENT_STATE:
107
return yaml_parser_parse_document_content(parser, event)
109
case yaml_PARSE_DOCUMENT_END_STATE:
110
return yaml_parser_parse_document_end(parser, event)
112
case yaml_PARSE_BLOCK_NODE_STATE:
113
return yaml_parser_parse_node(parser, event, true, false)
115
case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
116
return yaml_parser_parse_node(parser, event, true, true)
118
case yaml_PARSE_FLOW_NODE_STATE:
119
return yaml_parser_parse_node(parser, event, false, false)
121
case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
122
return yaml_parser_parse_block_sequence_entry(parser, event, true)
124
case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
125
return yaml_parser_parse_block_sequence_entry(parser, event, false)
127
case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
128
return yaml_parser_parse_indentless_sequence_entry(parser, event)
130
case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
131
return yaml_parser_parse_block_mapping_key(parser, event, true)
133
case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
134
return yaml_parser_parse_block_mapping_key(parser, event, false)
136
case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
137
return yaml_parser_parse_block_mapping_value(parser, event)
139
case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
140
return yaml_parser_parse_flow_sequence_entry(parser, event, true)
142
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
143
return yaml_parser_parse_flow_sequence_entry(parser, event, false)
145
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
146
return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
148
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
149
return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
151
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
152
return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
154
case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
155
return yaml_parser_parse_flow_mapping_key(parser, event, true)
157
case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
158
return yaml_parser_parse_flow_mapping_key(parser, event, false)
160
case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
161
return yaml_parser_parse_flow_mapping_value(parser, event, false)
163
case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
164
return yaml_parser_parse_flow_mapping_value(parser, event, true)
167
panic("invalid parser state")
172
// Parse the production:
173
// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
175
func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
176
token := peek_token(parser)
180
if token.typ != yaml_STREAM_START_TOKEN {
181
return yaml_parser_set_parser_error(parser, "did not find expected <stream-start>", token.start_mark)
183
parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
184
*event = yaml_event_t{
185
typ: yaml_STREAM_START_EVENT,
186
start_mark: token.start_mark,
187
end_mark: token.end_mark,
188
encoding: token.encoding,
194
// Parse the productions:
195
// implicit_document ::= block_node DOCUMENT-END*
197
// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
198
// *************************
199
func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
201
token := peek_token(parser)
206
// Parse extra document end indicators.
208
for token.typ == yaml_DOCUMENT_END_TOKEN {
210
token = peek_token(parser)
217
if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
218
token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
219
token.typ != yaml_DOCUMENT_START_TOKEN &&
220
token.typ != yaml_STREAM_END_TOKEN {
221
// Parse an implicit document.
222
if !yaml_parser_process_directives(parser, nil, nil) {
225
parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
226
parser.state = yaml_PARSE_BLOCK_NODE_STATE
228
*event = yaml_event_t{
229
typ: yaml_DOCUMENT_START_EVENT,
230
start_mark: token.start_mark,
231
end_mark: token.end_mark,
234
} else if token.typ != yaml_STREAM_END_TOKEN {
235
// Parse an explicit document.
236
var version_directive *yaml_version_directive_t
237
var tag_directives []yaml_tag_directive_t
238
start_mark := token.start_mark
239
if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
242
token = peek_token(parser)
246
if token.typ != yaml_DOCUMENT_START_TOKEN {
247
yaml_parser_set_parser_error(parser,
248
"did not find expected <document start>", token.start_mark)
251
parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
252
parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
253
end_mark := token.end_mark
255
*event = yaml_event_t{
256
typ: yaml_DOCUMENT_START_EVENT,
257
start_mark: start_mark,
259
version_directive: version_directive,
260
tag_directives: tag_directives,
266
// Parse the stream end.
267
parser.state = yaml_PARSE_END_STATE
268
*event = yaml_event_t{
269
typ: yaml_STREAM_END_EVENT,
270
start_mark: token.start_mark,
271
end_mark: token.end_mark,
279
// Parse the productions:
280
// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
283
func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
284
token := peek_token(parser)
288
if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
289
token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
290
token.typ == yaml_DOCUMENT_START_TOKEN ||
291
token.typ == yaml_DOCUMENT_END_TOKEN ||
292
token.typ == yaml_STREAM_END_TOKEN {
293
parser.state = parser.states[len(parser.states)-1]
294
parser.states = parser.states[:len(parser.states)-1]
295
return yaml_parser_process_empty_scalar(parser, event,
298
return yaml_parser_parse_node(parser, event, true, false)
301
// Parse the productions:
302
// implicit_document ::= block_node DOCUMENT-END*
304
// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
306
func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
307
token := peek_token(parser)
312
start_mark := token.start_mark
313
end_mark := token.start_mark
316
if token.typ == yaml_DOCUMENT_END_TOKEN {
317
end_mark = token.end_mark
322
parser.tag_directives = parser.tag_directives[:0]
324
parser.state = yaml_PARSE_DOCUMENT_START_STATE
325
*event = yaml_event_t{
326
typ: yaml_DOCUMENT_END_EVENT,
327
start_mark: start_mark,
334
// Parse the productions:
335
// block_node_or_indentless_sequence ::=
338
// | properties (block_content | indentless_block_sequence)?
340
// | block_content | indentless_block_sequence
342
// block_node ::= ALIAS
344
// | properties block_content?
348
// flow_node ::= ALIAS
350
// | properties flow_content?
354
// properties ::= TAG ANCHOR? | ANCHOR TAG?
355
// *************************
356
// block_content ::= block_collection | flow_collection | SCALAR
358
// flow_content ::= flow_collection | SCALAR
360
func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
361
//defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
363
token := peek_token(parser)
368
if token.typ == yaml_ALIAS_TOKEN {
369
parser.state = parser.states[len(parser.states)-1]
370
parser.states = parser.states[:len(parser.states)-1]
371
*event = yaml_event_t{
372
typ: yaml_ALIAS_EVENT,
373
start_mark: token.start_mark,
374
end_mark: token.end_mark,
381
start_mark := token.start_mark
382
end_mark := token.start_mark
385
var tag_handle, tag_suffix, anchor []byte
386
var tag_mark yaml_mark_t
387
if token.typ == yaml_ANCHOR_TOKEN {
389
start_mark = token.start_mark
390
end_mark = token.end_mark
392
token = peek_token(parser)
396
if token.typ == yaml_TAG_TOKEN {
398
tag_handle = token.value
399
tag_suffix = token.suffix
400
tag_mark = token.start_mark
401
end_mark = token.end_mark
403
token = peek_token(parser)
408
} else if token.typ == yaml_TAG_TOKEN {
410
tag_handle = token.value
411
tag_suffix = token.suffix
412
start_mark = token.start_mark
413
tag_mark = token.start_mark
414
end_mark = token.end_mark
416
token = peek_token(parser)
420
if token.typ == yaml_ANCHOR_TOKEN {
422
end_mark = token.end_mark
424
token = peek_token(parser)
433
if len(tag_handle) == 0 {
437
for i := range parser.tag_directives {
438
if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
439
tag = append([]byte(nil), parser.tag_directives[i].prefix...)
440
tag = append(tag, tag_suffix...)
445
yaml_parser_set_parser_error_context(parser,
446
"while parsing a node", start_mark,
447
"found undefined tag handle", tag_mark)
453
implicit := len(tag) == 0
454
if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
455
end_mark = token.end_mark
456
parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
457
*event = yaml_event_t{
458
typ: yaml_SEQUENCE_START_EVENT,
459
start_mark: start_mark,
464
style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
468
if token.typ == yaml_SCALAR_TOKEN {
469
var plain_implicit, quoted_implicit bool
470
end_mark = token.end_mark
471
if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
472
plain_implicit = true
473
} else if len(tag) == 0 {
474
quoted_implicit = true
476
parser.state = parser.states[len(parser.states)-1]
477
parser.states = parser.states[:len(parser.states)-1]
479
*event = yaml_event_t{
480
typ: yaml_SCALAR_EVENT,
481
start_mark: start_mark,
486
implicit: plain_implicit,
487
quoted_implicit: quoted_implicit,
488
style: yaml_style_t(token.style),
493
if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
494
// [Go] Some of the events below can be merged as they differ only on style.
495
end_mark = token.end_mark
496
parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
497
*event = yaml_event_t{
498
typ: yaml_SEQUENCE_START_EVENT,
499
start_mark: start_mark,
504
style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
508
if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
509
end_mark = token.end_mark
510
parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
511
*event = yaml_event_t{
512
typ: yaml_MAPPING_START_EVENT,
513
start_mark: start_mark,
518
style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
522
if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
523
end_mark = token.end_mark
524
parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
525
*event = yaml_event_t{
526
typ: yaml_SEQUENCE_START_EVENT,
527
start_mark: start_mark,
532
style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
536
if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
537
end_mark = token.end_mark
538
parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
539
*event = yaml_event_t{
540
typ: yaml_MAPPING_START_EVENT,
541
start_mark: start_mark,
546
style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
550
if len(anchor) > 0 || len(tag) > 0 {
551
parser.state = parser.states[len(parser.states)-1]
552
parser.states = parser.states[:len(parser.states)-1]
554
*event = yaml_event_t{
555
typ: yaml_SCALAR_EVENT,
556
start_mark: start_mark,
561
quoted_implicit: false,
562
style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
567
context := "while parsing a flow node"
569
context = "while parsing a block node"
571
yaml_parser_set_parser_error_context(parser, context, start_mark,
572
"did not find expected node content", token.start_mark)
576
// Parse the productions:
577
// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
578
// ******************** *********** * *********
580
func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
582
token := peek_token(parser)
583
parser.marks = append(parser.marks, token.start_mark)
587
token := peek_token(parser)
592
if token.typ == yaml_BLOCK_ENTRY_TOKEN {
593
mark := token.end_mark
595
token = peek_token(parser)
599
if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
600
parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
601
return yaml_parser_parse_node(parser, event, true, false)
603
parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
604
return yaml_parser_process_empty_scalar(parser, event, mark)
607
if token.typ == yaml_BLOCK_END_TOKEN {
608
parser.state = parser.states[len(parser.states)-1]
609
parser.states = parser.states[:len(parser.states)-1]
610
parser.marks = parser.marks[:len(parser.marks)-1]
612
*event = yaml_event_t{
613
typ: yaml_SEQUENCE_END_EVENT,
614
start_mark: token.start_mark,
615
end_mark: token.end_mark,
622
context_mark := parser.marks[len(parser.marks)-1]
623
parser.marks = parser.marks[:len(parser.marks)-1]
624
return yaml_parser_set_parser_error_context(parser,
625
"while parsing a block collection", context_mark,
626
"did not find expected '-' indicator", token.start_mark)
629
// Parse the productions:
630
// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
632
func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
633
token := peek_token(parser)
638
if token.typ == yaml_BLOCK_ENTRY_TOKEN {
639
mark := token.end_mark
641
token = peek_token(parser)
645
if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
646
token.typ != yaml_KEY_TOKEN &&
647
token.typ != yaml_VALUE_TOKEN &&
648
token.typ != yaml_BLOCK_END_TOKEN {
649
parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
650
return yaml_parser_parse_node(parser, event, true, false)
652
parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
653
return yaml_parser_process_empty_scalar(parser, event, mark)
655
parser.state = parser.states[len(parser.states)-1]
656
parser.states = parser.states[:len(parser.states)-1]
658
*event = yaml_event_t{
659
typ: yaml_SEQUENCE_END_EVENT,
660
start_mark: token.start_mark,
661
end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark?
666
// Parse the productions:
667
// block_mapping ::= BLOCK-MAPPING_START
668
// *******************
669
// ((KEY block_node_or_indentless_sequence?)?
671
// (VALUE block_node_or_indentless_sequence?)?)*
676
func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
678
token := peek_token(parser)
679
parser.marks = append(parser.marks, token.start_mark)
683
token := peek_token(parser)
688
if token.typ == yaml_KEY_TOKEN {
689
mark := token.end_mark
691
token = peek_token(parser)
695
if token.typ != yaml_KEY_TOKEN &&
696
token.typ != yaml_VALUE_TOKEN &&
697
token.typ != yaml_BLOCK_END_TOKEN {
698
parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
699
return yaml_parser_parse_node(parser, event, true, true)
701
parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
702
return yaml_parser_process_empty_scalar(parser, event, mark)
704
} else if token.typ == yaml_BLOCK_END_TOKEN {
705
parser.state = parser.states[len(parser.states)-1]
706
parser.states = parser.states[:len(parser.states)-1]
707
parser.marks = parser.marks[:len(parser.marks)-1]
708
*event = yaml_event_t{
709
typ: yaml_MAPPING_END_EVENT,
710
start_mark: token.start_mark,
711
end_mark: token.end_mark,
717
context_mark := parser.marks[len(parser.marks)-1]
718
parser.marks = parser.marks[:len(parser.marks)-1]
719
return yaml_parser_set_parser_error_context(parser,
720
"while parsing a block mapping", context_mark,
721
"did not find expected key", token.start_mark)
724
// Parse the productions:
725
// block_mapping ::= BLOCK-MAPPING_START
727
// ((KEY block_node_or_indentless_sequence?)?
729
// (VALUE block_node_or_indentless_sequence?)?)*
734
func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
735
token := peek_token(parser)
739
if token.typ == yaml_VALUE_TOKEN {
740
mark := token.end_mark
742
token = peek_token(parser)
746
if token.typ != yaml_KEY_TOKEN &&
747
token.typ != yaml_VALUE_TOKEN &&
748
token.typ != yaml_BLOCK_END_TOKEN {
749
parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
750
return yaml_parser_parse_node(parser, event, true, true)
752
parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
753
return yaml_parser_process_empty_scalar(parser, event, mark)
755
parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
756
return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
759
// Parse the productions:
760
// flow_sequence ::= FLOW-SEQUENCE-START
761
// *******************
762
// (flow_sequence_entry FLOW-ENTRY)*
764
// flow_sequence_entry?
768
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
771
func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
773
token := peek_token(parser)
774
parser.marks = append(parser.marks, token.start_mark)
777
token := peek_token(parser)
781
if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
783
if token.typ == yaml_FLOW_ENTRY_TOKEN {
785
token = peek_token(parser)
790
context_mark := parser.marks[len(parser.marks)-1]
791
parser.marks = parser.marks[:len(parser.marks)-1]
792
return yaml_parser_set_parser_error_context(parser,
793
"while parsing a flow sequence", context_mark,
794
"did not find expected ',' or ']'", token.start_mark)
798
if token.typ == yaml_KEY_TOKEN {
799
parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
800
*event = yaml_event_t{
801
typ: yaml_MAPPING_START_EVENT,
802
start_mark: token.start_mark,
803
end_mark: token.end_mark,
805
style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
809
} else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
810
parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
811
return yaml_parser_parse_node(parser, event, false, false)
815
parser.state = parser.states[len(parser.states)-1]
816
parser.states = parser.states[:len(parser.states)-1]
817
parser.marks = parser.marks[:len(parser.marks)-1]
819
*event = yaml_event_t{
820
typ: yaml_SEQUENCE_END_EVENT,
821
start_mark: token.start_mark,
822
end_mark: token.end_mark,
830
// Parse the productions:
831
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
834
func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
835
token := peek_token(parser)
839
if token.typ != yaml_VALUE_TOKEN &&
840
token.typ != yaml_FLOW_ENTRY_TOKEN &&
841
token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
842
parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
843
return yaml_parser_parse_node(parser, event, false, false)
845
mark := token.end_mark
847
parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
848
return yaml_parser_process_empty_scalar(parser, event, mark)
851
// Parse the productions:
852
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
855
func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
856
token := peek_token(parser)
860
if token.typ == yaml_VALUE_TOKEN {
862
token := peek_token(parser)
866
if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
867
parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
868
return yaml_parser_parse_node(parser, event, false, false)
871
parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
872
return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
875
// Parse the productions:
876
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
879
func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
880
token := peek_token(parser)
884
parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
885
*event = yaml_event_t{
886
typ: yaml_MAPPING_END_EVENT,
887
start_mark: token.start_mark,
888
end_mark: token.start_mark, // [Go] Shouldn't this be end_mark?
893
// Parse the productions:
894
// flow_mapping ::= FLOW-MAPPING-START
895
// ******************
896
// (flow_mapping_entry FLOW-ENTRY)*
898
// flow_mapping_entry?
899
// ******************
902
// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
905
func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
907
token := peek_token(parser)
908
parser.marks = append(parser.marks, token.start_mark)
912
token := peek_token(parser)
917
if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
919
if token.typ == yaml_FLOW_ENTRY_TOKEN {
921
token = peek_token(parser)
926
context_mark := parser.marks[len(parser.marks)-1]
927
parser.marks = parser.marks[:len(parser.marks)-1]
928
return yaml_parser_set_parser_error_context(parser,
929
"while parsing a flow mapping", context_mark,
930
"did not find expected ',' or '}'", token.start_mark)
934
if token.typ == yaml_KEY_TOKEN {
936
token = peek_token(parser)
940
if token.typ != yaml_VALUE_TOKEN &&
941
token.typ != yaml_FLOW_ENTRY_TOKEN &&
942
token.typ != yaml_FLOW_MAPPING_END_TOKEN {
943
parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
944
return yaml_parser_parse_node(parser, event, false, false)
946
parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
947
return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
949
} else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
950
parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
951
return yaml_parser_parse_node(parser, event, false, false)
955
parser.state = parser.states[len(parser.states)-1]
956
parser.states = parser.states[:len(parser.states)-1]
957
parser.marks = parser.marks[:len(parser.marks)-1]
958
*event = yaml_event_t{
959
typ: yaml_MAPPING_END_EVENT,
960
start_mark: token.start_mark,
961
end_mark: token.end_mark,
967
// Parse the productions:
968
// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
971
func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
972
token := peek_token(parser)
977
parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
978
return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
980
if token.typ == yaml_VALUE_TOKEN {
982
token = peek_token(parser)
986
if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
987
parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
988
return yaml_parser_parse_node(parser, event, false, false)
991
parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
992
return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
995
// Generate an empty scalar event.
996
func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
997
*event = yaml_event_t{
998
typ: yaml_SCALAR_EVENT,
1001
value: nil, // Empty
1003
style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
1008
var default_tag_directives = []yaml_tag_directive_t{
1009
{[]byte("!"), []byte("!")},
1010
{[]byte("!!"), []byte("tag:yaml.org,2002:")},
1013
// Parse directives.
1014
func yaml_parser_process_directives(parser *yaml_parser_t,
1015
version_directive_ref **yaml_version_directive_t,
1016
tag_directives_ref *[]yaml_tag_directive_t) bool {
1018
var version_directive *yaml_version_directive_t
1019
var tag_directives []yaml_tag_directive_t
1021
token := peek_token(parser)
1026
for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
1027
if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
1028
if version_directive != nil {
1029
yaml_parser_set_parser_error(parser,
1030
"found duplicate %YAML directive", token.start_mark)
1033
if token.major != 1 || token.minor != 1 {
1034
yaml_parser_set_parser_error(parser,
1035
"found incompatible YAML document", token.start_mark)
1038
version_directive = &yaml_version_directive_t{
1042
} else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
1043
value := yaml_tag_directive_t{
1044
handle: token.value,
1045
prefix: token.prefix,
1047
if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
1050
tag_directives = append(tag_directives, value)
1054
token = peek_token(parser)
1060
for i := range default_tag_directives {
1061
if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
1066
if version_directive_ref != nil {
1067
*version_directive_ref = version_directive
1069
if tag_directives_ref != nil {
1070
*tag_directives_ref = tag_directives
1075
// Append a tag directive to the directives stack.
1076
func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
1077
for i := range parser.tag_directives {
1078
if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
1079
if allow_duplicates {
1082
return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
1086
// [Go] I suspect the copy is unnecessary. This was likely done
1087
// because there was no way to track ownership of the data.
1088
value_copy := yaml_tag_directive_t{
1089
handle: make([]byte, len(value.handle)),
1090
prefix: make([]byte, len(value.prefix)),
1092
copy(value_copy.handle, value.handle)
1093
copy(value_copy.prefix, value.prefix)
1094
parser.tag_directives = append(parser.tag_directives, value_copy)