3 * The parser implements the following grammar:
5 * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
6 * implicit_document ::= block_node DOCUMENT-END*
7 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
8 * block_node_or_indentless_sequence ::=
10 * | properties (block_content | indentless_block_sequence)?
12 * | indentless_block_sequence
13 * block_node ::= ALIAS
14 * | properties block_content?
17 * | properties flow_content?
19 * properties ::= TAG ANCHOR? | ANCHOR TAG?
20 * block_content ::= block_collection | flow_collection | SCALAR
21 * flow_content ::= flow_collection | SCALAR
22 * block_collection ::= block_sequence | block_mapping
23 * flow_collection ::= flow_sequence | flow_mapping
24 * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
25 * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
26 * block_mapping ::= BLOCK-MAPPING_START
27 * ((KEY block_node_or_indentless_sequence?)?
28 * (VALUE block_node_or_indentless_sequence?)?)*
30 * flow_sequence ::= FLOW-SEQUENCE-START
31 * (flow_sequence_entry FLOW-ENTRY)*
32 * flow_sequence_entry?
34 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
35 * flow_mapping ::= FLOW-MAPPING-START
36 * (flow_mapping_entry FLOW-ENTRY)*
39 * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
51 * Public API declarations.
54 YAML_DECLARE(yaml_event_t *)
55 yaml_parser_get_event(yaml_parser_t *parser);
57 YAML_DECLARE(yaml_event_t *)
58 yaml_parser_peek_event(yaml_parser_t *parser);
65 yaml_parser_set_parser_error(yaml_parser_t *parser,
66 const char *problem, yaml_mark_t problem_mark);
69 yaml_parser_set_parser_error_context(yaml_parser_t *parser,
70 const char *context, yaml_mark_t context_mark,
71 const char *problem, yaml_mark_t problem_mark);
78 yaml_parser_resize_list(yaml_parser_t *parser, void **buffer, size_t *size,
82 yaml_parser_append_state(yaml_parser_t *parser, yaml_parser_state_t state);
85 yaml_parser_append_mark(yaml_parser_t *parser, yaml_mark_t mark);
92 yaml_parser_state_machine(yaml_parser_t *parser);
95 yaml_parser_parse_stream_start(yaml_parser_t *parser);
98 yaml_parser_parse_document_start(yaml_parser_t *parser, int implicit);
100 static yaml_event_t *
101 yaml_parser_parse_document_content(yaml_parser_t *parser);
103 static yaml_event_t *
104 yaml_parser_parse_document_end(yaml_parser_t *parser);
106 static yaml_event_t *
107 yaml_parser_parse_node(yaml_parser_t *parser,
108 int block, int indentless_sequence);
110 static yaml_event_t *
111 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, int first);
113 static yaml_event_t *
114 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser);
116 static yaml_event_t *
117 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, int first);
119 static yaml_event_t *
120 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser);
122 static yaml_event_t *
123 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, int first);
125 static yaml_event_t *
126 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser);
128 static yaml_event_t *
129 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser);
131 static yaml_event_t *
132 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser);
134 static yaml_event_t *
135 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, int first);
137 static yaml_event_t *
138 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser, int empty);
144 static yaml_event_t *
145 yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_mark_t mark);
148 yaml_parser_process_directives(yaml_parser_t *parser);
151 * Get the next event and advance the parser.
154 YAML_DECLARE(yaml_event_t *)
155 yaml_parser_get_event(yaml_parser_t *parser)
159 /* Update the current event if needed. */
161 if (!parser->current_event) {
162 parser->current_event = yaml_parser_state_machine(parser);
165 /* Return and clear the current event. */
167 value = parser->current_event;
168 parser->current_event = NULL;
173 * Peek the next event.
176 YAML_DECLARE(yaml_event_t *)
177 yaml_parser_peek_event(yaml_parser_t *parser)
181 /* Update the current event if needed. */
183 if (!parser->current_event) {
184 parser->current_event = yaml_parser_state_machine(parser);
187 /* Return the current event. */
189 return parser->current_event;
197 yaml_parser_set_parser_error(yaml_parser_t *parser,
198 const char *problem, yaml_mark_t problem_mark)
200 parser->error = YAML_PARSER_ERROR;
201 parser->problem = problem;
202 parser->problem_mark = problem_mark;
208 yaml_parser_set_parser_error_context(yaml_parser_t *parser,
209 const char *context, yaml_mark_t context_mark,
210 const char *problem, yaml_mark_t problem_mark)
212 parser->error = YAML_PARSER_ERROR;
213 parser->context = context;
214 parser->context_mark = context_mark;
215 parser->problem = problem;
216 parser->problem_mark = problem_mark;
222 * Push a state to the state stack.
226 yaml_parser_append_state(yaml_parser_t *parser, yaml_parser_state_t state)
228 if (parser->states_length == parser->states_size-1) {
229 if (!yaml_parser_resize_list(parser, (void **)&parser->states,
230 &parser->states_size, sizeof(yaml_parser_state_t)))
234 parser->states[parser->states_length++] = state;
239 * Push a mark to the mark stack.
243 yaml_parser_append_mark(yaml_parser_t *parser, yaml_mark_t mark)
245 if (parser->marks_length == parser->marks_size-1) {
246 if (!yaml_parser_resize_list(parser, (void **)&parser->marks,
247 &parser->marks_size, sizeof(yaml_mark_t)))
251 parser->marks[parser->marks_length++] = mark;
259 static yaml_event_t *
260 yaml_parser_state_machine(yaml_parser_t *parser)
262 assert (parser->state != YAML_PARSE_END_STATE);
264 switch (parser->state)
266 case YAML_PARSE_STREAM_START_STATE:
267 return yaml_parser_parse_stream_start(parser);
269 case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
270 return yaml_parser_parse_document_start(parser, 1);
272 case YAML_PARSE_DOCUMENT_START_STATE:
273 return yaml_parser_parse_document_start(parser, 0);
275 case YAML_PARSE_DOCUMENT_CONTENT_STATE:
276 return yaml_parser_parse_document_content(parser);
278 case YAML_PARSE_DOCUMENT_END_STATE:
279 return yaml_parser_parse_document_end(parser);
281 case YAML_PARSE_BLOCK_NODE_STATE:
282 return yaml_parser_parse_node(parser, 1, 0);
284 case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
285 return yaml_parser_parse_node(parser, 1, 1);
287 case YAML_PARSE_FLOW_NODE_STATE:
288 return yaml_parser_parse_node(parser, 0, 0);
290 case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
291 return yaml_parser_parse_block_sequence_entry(parser, 1);
293 case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
294 return yaml_parser_parse_block_sequence_entry(parser, 0);
296 case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
297 return yaml_parser_parse_indentless_sequence_entry(parser);
299 case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
300 return yaml_parser_parse_block_mapping_key(parser, 1);
302 case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
303 return yaml_parser_parse_block_mapping_key(parser, 0);
305 case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
306 return yaml_parser_parse_block_mapping_value(parser);
308 case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
309 return yaml_parser_parse_flow_sequence_entry(parser, 1);
311 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
312 return yaml_parser_parse_flow_sequence_entry(parser, 0);
314 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
315 return yaml_parser_parse_flow_sequence_entry_mapping_key(parser);
317 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
318 return yaml_parser_parse_flow_sequence_entry_mapping_value(parser);
320 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
321 return yaml_parser_parse_flow_sequence_entry_mapping_end(parser);
323 case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
324 return yaml_parser_parse_flow_mapping_key(parser, 1);
326 case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
327 return yaml_parser_parse_flow_mapping_key(parser, 0);
329 case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
330 return yaml_parser_parse_flow_mapping_value(parser, 0);
332 case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
333 return yaml_parser_parse_flow_mapping_value(parser, 1);
339 * Parse the production:
340 * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
344 static yaml_event_t *
345 yaml_parser_parse_stream_start(yaml_parser_t *parser)
350 token = yaml_parser_get_token(parser);
351 if (!token) return NULL;
353 assert(token->type == YAML_STREAM_START_TOKEN);
355 event = yaml_stream_start_event_new(token->data.stream_start.encoding,
356 token->start_mark, token->start_mark);
357 yaml_token_delete(token);
359 parser->error = YAML_MEMORY_ERROR;
363 parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
369 * Parse the productions:
370 * implicit_document ::= block_node DOCUMENT-END*
372 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
373 * *************************
376 static yaml_event_t *
377 yaml_parser_parse_document_start(yaml_parser_t *parser, int implicit)
382 token = yaml_parser_peek_token(parser);
383 if (!token) return NULL;
385 /* Parse an implicit document. */
387 if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
388 token->type != YAML_TAG_DIRECTIVE_TOKEN &&
389 token->type != YAML_DOCUMENT_START_TOKEN &&
390 token->type != YAML_STREAM_END_TOKEN)
392 if (!yaml_parser_process_directives(parser)) return NULL;
393 if (!yaml_parser_append_state(parser, YAML_PARSE_DOCUMENT_END_STATE))
395 parser->state = YAML_PARSE_BLOCK_NODE_STATE;
396 event = yaml_document_start_event_new(
397 parser->version_directive, parser->tag_directives, 1,
398 token->start_mark, token->start_mark);
399 if (!event) return NULL;
403 /* Parse an explicit document. */
405 else if (token->type != YAML_STREAM_END_TOKEN)
407 yaml_mark_t start_mark, end_mark;
408 start_mark = token->start_mark;
409 if (!yaml_parser_process_directives(parser)) return NULL;
410 token = yaml_parser_peek_token(parser);
411 if (!token) return NULL;
412 if (token->type != YAML_DOCUMENT_START_TOKEN) {
413 yaml_parser_set_parser_error(parser,
414 "did not found expected <document start>", token->start_mark);
417 token = yaml_parser_get_token(parser);
418 end_mark = token->end_mark;
419 yaml_token_delete(token);
420 if (!yaml_parser_append_state(parser, YAML_PARSE_DOCUMENT_END_STATE))
422 parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
423 event = yaml_document_start_event_new(
424 parser->version_directive, parser->tag_directives, 0,
425 start_mark, end_mark);
426 if (!event) return NULL;
430 /* Parse the stream end. */
434 token = yaml_parser_get_token(parser);
435 parser->state = YAML_PARSE_END_STATE;
436 event = yaml_stream_end_event_new(token->start_mark, token->end_mark);
437 yaml_token_delete(token);
443 * Parse the productions:
444 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
448 static yaml_event_t *
449 yaml_parser_parse_document_content(yaml_parser_t *parser)
453 token = yaml_parser_peek_token(parser);
454 if (!token) return NULL;
456 if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
457 token->type == YAML_TAG_DIRECTIVE_TOKEN ||
458 token->type == YAML_DOCUMENT_START_TOKEN ||
459 token->type == YAML_DOCUMENT_END_TOKEN ||
460 token->type == YAML_STREAM_END_TOKEN) {
461 parser->state = parser->states[--parser->states_length];
462 return yaml_parser_process_empty_scalar(parser, token->start_mark);
465 return yaml_parser_parse_node(parser, 1, 0);
470 * Parse the productions:
471 * implicit_document ::= block_node DOCUMENT-END*
473 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
477 static yaml_event_t *
478 yaml_parser_parse_document_end(yaml_parser_t *parser)
482 yaml_mark_t start_mark, end_mark;
485 token = yaml_parser_peek_token(parser);
486 if (!token) return NULL;
488 start_mark = end_mark = token->start_mark;
490 while (token->type == YAML_DOCUMENT_END_TOKEN) {
491 end_mark = token->end_mark;
492 yaml_token_delete(yaml_parser_get_token(parser));
493 token = yaml_parser_peek_token(parser);
494 if (!token) return NULL;
498 event = yaml_document_end_event_new(implicit, start_mark, end_mark);
500 parser->error = YAML_MEMORY_ERROR;
507 * Parse the productions:
508 * block_node_or_indentless_sequence ::=
511 * | properties (block_content | indentless_block_sequence)?
513 * | block_content | indentless_block_sequence
515 * block_node ::= ALIAS
517 * | properties block_content?
521 * flow_node ::= ALIAS
523 * | properties flow_content?
527 * properties ::= TAG ANCHOR? | ANCHOR TAG?
528 * *************************
529 * block_content ::= block_collection | flow_collection | SCALAR
531 * flow_content ::= flow_collection | SCALAR
535 static yaml_event_t *
536 yaml_parser_parse_node(yaml_parser_t *parser,
537 int block, int indentless_sequence)
541 yaml_char_t *anchor = NULL;
542 yaml_char_t *tag_handle = NULL;
543 yaml_char_t *tag_suffix = NULL;
544 yaml_char_t *tag = NULL;
545 yaml_mark_t start_mark, end_mark, tag_mark;
548 token = yaml_parser_peek_token(parser);
549 if (!token) return NULL;
551 if (token->type == YAML_ALIAS_TOKEN)
553 token = yaml_parser_get_token(parser);
554 event = yaml_alias_event_new(token->data.alias.value,
555 token->start_mark, token->end_mark);
557 yaml_token_delete(token);
558 parser->error = YAML_MEMORY_ERROR;
567 start_mark = end_mark = token->start_mark;
569 if (token->type == YAML_ANCHOR_TOKEN)
571 token = yaml_parser_get_token(parser);
572 anchor = token->data.anchor.value;
573 start_mark = token->start_mark;
574 end_mark = token->end_mark;
576 token = yaml_parser_peek_token(parser);
577 if (!token) goto error;
578 if (token->type == YAML_TAG_TOKEN)
580 token = yaml_parser_get_token(parser);
581 tag_handle = token->data.tag.handle;
582 tag_suffix = token->data.tag.suffix;
583 tag_mark = token->start_mark;
584 end_mark = token->end_mark;
586 token = yaml_parser_peek_token(parser);
587 if (!token) goto error;
590 else if (token->type == YAML_TAG_TOKEN)
592 token = yaml_parser_get_token(parser);
593 tag_handle = token->data.tag.handle;
594 tag_suffix = token->data.tag.suffix;
595 start_mark = tag_mark = token->start_mark;
596 end_mark = token->end_mark;
598 token = yaml_parser_peek_token(parser);
599 if (!token) goto error;
600 if (token->type == YAML_ANCHOR_TOKEN)
602 token = yaml_parser_get_token(parser);
603 anchor = token->data.anchor.value;
604 end_mark = token->end_mark;
606 token = yaml_parser_peek_token(parser);
607 if (!token) goto error;
614 yaml_free(tag_handle);
615 tag_handle = tag_suffix = NULL;
618 yaml_tag_directive_t **tag_directive = parser->tag_directives;
619 for (tag_directive = parser->tag_directives;
620 *tag_directive; tag_directive++) {
621 if (strcmp((char *)(*tag_directive)->handle, (char *)tag_handle) == 0) {
622 size_t prefix_len = strlen((char *)(*tag_directive)->prefix);
623 size_t suffix_len = strlen((char *)tag_suffix);
624 tag = yaml_malloc(prefix_len+suffix_len+1);
626 parser->error = YAML_MEMORY_ERROR;
629 memcpy(tag, (*tag_directive)->handle, prefix_len);
630 memcpy(tag+prefix_len, tag_suffix, suffix_len);
631 tag[prefix_len+suffix_len] = '\0';
632 yaml_free(tag_handle);
633 yaml_free(tag_suffix);
634 tag_handle = tag_suffix = NULL;
638 if (*tag_directive) {
639 yaml_parser_set_parser_error_context(parser,
640 "while parsing a node", start_mark,
641 "found undefined tag handle", tag_mark);
647 implicit = (!tag || !*tag);
648 if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
649 end_mark = token->end_mark;
650 parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
651 event = yaml_sequence_start_event_new(anchor, tag, implicit,
652 YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
653 if (!event) goto error;
656 if (token->type == YAML_SCALAR_TOKEN) {
657 int plain_implicit = 0;
658 int quoted_implicit = 0;
659 token = yaml_parser_get_token(parser);
660 end_mark = token->end_mark;
661 if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
662 || strcmp((char *)tag, "!") == 0) {
668 parser->state = parser->states[--parser->states_length];
669 event = yaml_scalar_event_new(anchor, tag,
670 token->data.scalar.value, token->data.scalar.length,
671 plain_implicit, quoted_implicit,
672 token->data.scalar.style, start_mark, end_mark);
674 parser->error = YAML_MEMORY_ERROR;
675 yaml_token_delete(token);
680 else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
681 end_mark = token->end_mark;
682 parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
683 event = yaml_sequence_start_event_new(anchor, tag, implicit,
684 YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
686 parser->error = YAML_MEMORY_ERROR;
690 else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
691 end_mark = token->end_mark;
692 parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
693 event = yaml_mapping_start_event_new(anchor, tag, implicit,
694 YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
696 parser->error = YAML_MEMORY_ERROR;
700 else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
701 end_mark = token->end_mark;
702 parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
703 event = yaml_sequence_start_event_new(anchor, tag, implicit,
704 YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
706 parser->error = YAML_MEMORY_ERROR;
710 else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
711 end_mark = token->end_mark;
712 parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
713 event = yaml_mapping_start_event_new(anchor, tag, implicit,
714 YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
716 parser->error = YAML_MEMORY_ERROR;
720 else if (anchor || tag) {
721 yaml_char_t *value = yaml_malloc(1);
723 parser->error = YAML_MEMORY_ERROR;
727 event = yaml_scalar_event_new(anchor, tag, value, 0,
728 implicit, 0, YAML_PLAIN_SCALAR_STYLE,
729 start_mark, end_mark);
732 parser->error = YAML_MEMORY_ERROR;
737 yaml_parser_set_parser_error_context(parser,
738 (block ? "while parsing a block node"
739 : "while parsing a flow node"), start_mark,
740 "did not found expected node content", token->start_mark);
749 yaml_free(tag_handle);
750 yaml_free(tag_suffix);
757 * Parse the productions:
758 * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
759 * ******************** *********** * *********
762 static yaml_event_t *
763 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, int first)
769 token = yaml_parser_get_token(parser);
770 if (!yaml_parser_append_mark(parser, token->start_mark)) {
771 yaml_token_delete(token);
774 yaml_token_delete(token);
777 token = yaml_parser_get_token(parser);
778 if (!token) return NULL;
780 if (token->type == YAML_BLOCK_ENTRY_TOKEN)
782 yaml_mark_t mark = token->end_mark;
783 yaml_token_delete(token);
784 token = yaml_parser_peek_token(parser);
785 if (!token) return NULL;
786 if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
787 token->type != YAML_BLOCK_END_TOKEN) {
788 if (!yaml_parser_append_state(parser,
789 YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
791 return yaml_parser_parse_node(parser, 1, 0);
794 parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
795 return yaml_parser_process_empty_scalar(parser, mark);
799 else if (token->type == YAML_BLOCK_END_TOKEN)
801 parser->state = parser->states[--parser->states_length];
802 event = yaml_sequence_end_event_new(token->start_mark, token->end_mark);
803 yaml_token_delete(token);
805 parser->error = YAML_MEMORY_ERROR;
813 yaml_parser_set_parser_error_context(parser,
814 "while parsing a block collection", parser->marks[parser->marks_length-1],
815 "did not found expected '-' indicator", token->start_mark);
816 yaml_token_delete(token);
822 * Parse the productions:
823 * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
827 static yaml_event_t *
828 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser)
833 token = yaml_parser_peek_token(parser);
834 if (!token) return NULL;
836 if (token->type == YAML_BLOCK_ENTRY_TOKEN)
838 yaml_mark_t mark = token->end_mark;
839 yaml_token_delete(yaml_parser_get_token(parser));
840 token = yaml_parser_peek_token(parser);
841 if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
842 token->type != YAML_BLOCK_END_TOKEN) {
843 if (!yaml_parser_append_state(parser,
844 YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
846 return yaml_parser_parse_node(parser, 1, 0);
849 parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
850 return yaml_parser_process_empty_scalar(parser, mark);
856 parser->state = parser->states[--parser->states_length];
857 event = yaml_sequence_end_event_new(token->start_mark, token->start_mark);
859 parser->error = YAML_MEMORY_ERROR;
867 * Parse the productions:
868 * block_mapping ::= BLOCK-MAPPING_START
869 * *******************
870 * ((KEY block_node_or_indentless_sequence?)?
872 * (VALUE block_node_or_indentless_sequence?)?)*
878 static yaml_event_t *
879 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, int first)
885 token = yaml_parser_get_token(parser);
886 if (!yaml_parser_append_mark(parser, token->start_mark)) {
887 yaml_token_delete(token);
890 yaml_token_delete(token);
893 token = yaml_parser_get_token(parser);
894 if (!token) return NULL;
896 if (token->type == YAML_KEY_TOKEN)
898 yaml_mark_t mark = token->end_mark;
899 yaml_token_delete(token);
900 token = yaml_parser_peek_token(parser);
901 if (!token) return NULL;
902 if (token->type != YAML_KEY_TOKEN &&
903 token->type != YAML_VALUE_TOKEN &&
904 token->type != YAML_BLOCK_END_TOKEN) {
905 if (!yaml_parser_append_state(parser,
906 YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
908 return yaml_parser_parse_node(parser, 1, 1);
911 parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
912 return yaml_parser_process_empty_scalar(parser, mark);
916 else if (token->type == YAML_BLOCK_END_TOKEN)
918 parser->state = parser->states[--parser->states_length];
919 event = yaml_sequence_end_event_new(token->start_mark, token->end_mark);
920 yaml_token_delete(token);
922 parser->error = YAML_MEMORY_ERROR;
930 yaml_parser_set_parser_error_context(parser,
931 "while parsing a block mapping", parser->marks[parser->marks_length-1],
932 "did not found expected key", token->start_mark);
933 yaml_token_delete(token);
939 * Parse the productions:
940 * block_mapping ::= BLOCK-MAPPING_START
942 * ((KEY block_node_or_indentless_sequence?)?
944 * (VALUE block_node_or_indentless_sequence?)?)*
950 static yaml_event_t *
951 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser)
956 token = yaml_parser_peek_token(parser);
957 if (!token) return NULL;
959 if (token->type == YAML_VALUE_TOKEN)
961 yaml_mark_t mark = token->end_mark;
962 yaml_token_delete(yaml_parser_get_token(parser));
963 token = yaml_parser_peek_token(parser);
964 if (!token) return NULL;
965 if (token->type != YAML_KEY_TOKEN &&
966 token->type != YAML_VALUE_TOKEN &&
967 token->type != YAML_BLOCK_END_TOKEN) {
968 if (!yaml_parser_append_state(parser,
969 YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
971 return yaml_parser_parse_node(parser, 1, 1);
974 parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
975 return yaml_parser_process_empty_scalar(parser, mark);
981 parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
982 return yaml_parser_process_empty_scalar(parser, token->start_mark);
986 static yaml_event_t *
987 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, int first);
989 static yaml_event_t *
990 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser);
992 static yaml_event_t *
993 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser);
995 static yaml_event_t *
996 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser);
998 static yaml_event_t *
999 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, int first);
1001 static yaml_event_t *
1002 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser, int empty);