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_tag_directive(yaml_parser_t *parser,
83 yaml_tag_directive_t *tag_directive);
86 yaml_parser_append_state(yaml_parser_t *parser, yaml_parser_state_t state);
89 yaml_parser_append_mark(yaml_parser_t *parser, yaml_mark_t mark);
96 yaml_parser_state_machine(yaml_parser_t *parser);
99 yaml_parser_parse_stream_start(yaml_parser_t *parser);
101 static yaml_event_t *
102 yaml_parser_parse_document_start(yaml_parser_t *parser, int implicit);
104 static yaml_event_t *
105 yaml_parser_parse_document_content(yaml_parser_t *parser);
107 static yaml_event_t *
108 yaml_parser_parse_document_end(yaml_parser_t *parser);
110 static yaml_event_t *
111 yaml_parser_parse_node(yaml_parser_t *parser,
112 int block, int indentless_sequence);
114 static yaml_event_t *
115 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, int first);
117 static yaml_event_t *
118 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser);
120 static yaml_event_t *
121 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, int first);
123 static yaml_event_t *
124 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser);
126 static yaml_event_t *
127 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, int first);
129 static yaml_event_t *
130 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser);
132 static yaml_event_t *
133 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser);
135 static yaml_event_t *
136 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser);
138 static yaml_event_t *
139 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, int first);
141 static yaml_event_t *
142 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser, int empty);
148 static yaml_event_t *
149 yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_mark_t mark);
152 yaml_parser_process_directives(yaml_parser_t *parser);
155 * Get the next event and advance the parser.
158 YAML_DECLARE(yaml_event_t *)
159 yaml_parser_get_event(yaml_parser_t *parser)
163 /* Update the current event if needed. */
165 if (!parser->current_event) {
166 parser->current_event = yaml_parser_state_machine(parser);
169 /* Return and clear the current event. */
171 value = parser->current_event;
172 parser->current_event = NULL;
177 * Peek the next event.
180 YAML_DECLARE(yaml_event_t *)
181 yaml_parser_peek_event(yaml_parser_t *parser)
185 /* Update the current event if needed. */
187 if (!parser->current_event) {
188 parser->current_event = yaml_parser_state_machine(parser);
191 /* Return the current event. */
193 return parser->current_event;
201 yaml_parser_set_parser_error(yaml_parser_t *parser,
202 const char *problem, yaml_mark_t problem_mark)
204 parser->error = YAML_PARSER_ERROR;
205 parser->problem = problem;
206 parser->problem_mark = problem_mark;
212 yaml_parser_set_parser_error_context(yaml_parser_t *parser,
213 const char *context, yaml_mark_t context_mark,
214 const char *problem, yaml_mark_t problem_mark)
216 parser->error = YAML_PARSER_ERROR;
217 parser->context = context;
218 parser->context_mark = context_mark;
219 parser->problem = problem;
220 parser->problem_mark = problem_mark;
230 yaml_parser_resize_list(yaml_parser_t *parser, void **buffer, size_t *size,
233 void *new_buffer = yaml_realloc(*buffer, item_size*(*size)*2);
236 parser->error = YAML_MEMORY_ERROR;
240 memset(new_buffer+item_size*(*size), 0, item_size*(*size));
242 *buffer = new_buffer;
249 * Push a tag directive to the directive list.
253 yaml_parser_append_tag_directive(yaml_parser_t *parser,
254 yaml_tag_directive_t *tag_directive)
256 if (parser->tag_directives_length == parser->tag_directives_size-1) {
257 if (!yaml_parser_resize_list(parser, (void **)&parser->tag_directives,
258 &parser->tag_directives_size, sizeof(yaml_tag_directive_t)))
262 parser->tag_directives[parser->tag_directives_length++] = tag_directive;
263 parser->tag_directives[parser->tag_directives_length] = NULL;
268 * Push a state to the state stack.
272 yaml_parser_append_state(yaml_parser_t *parser, yaml_parser_state_t state)
274 if (parser->states_length == parser->states_size-1) {
275 if (!yaml_parser_resize_list(parser, (void **)&parser->states,
276 &parser->states_size, sizeof(yaml_parser_state_t)))
280 parser->states[parser->states_length++] = state;
285 * Push a mark to the mark stack.
289 yaml_parser_append_mark(yaml_parser_t *parser, yaml_mark_t mark)
291 if (parser->marks_length == parser->marks_size-1) {
292 if (!yaml_parser_resize_list(parser, (void **)&parser->marks,
293 &parser->marks_size, sizeof(yaml_mark_t)))
297 parser->marks[parser->marks_length++] = mark;
305 static yaml_event_t *
306 yaml_parser_state_machine(yaml_parser_t *parser)
308 assert (parser->state != YAML_PARSE_END_STATE);
310 switch (parser->state)
312 case YAML_PARSE_STREAM_START_STATE:
313 return yaml_parser_parse_stream_start(parser);
315 case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
316 return yaml_parser_parse_document_start(parser, 1);
318 case YAML_PARSE_DOCUMENT_START_STATE:
319 return yaml_parser_parse_document_start(parser, 0);
321 case YAML_PARSE_DOCUMENT_CONTENT_STATE:
322 return yaml_parser_parse_document_content(parser);
324 case YAML_PARSE_DOCUMENT_END_STATE:
325 return yaml_parser_parse_document_end(parser);
327 case YAML_PARSE_BLOCK_NODE_STATE:
328 return yaml_parser_parse_node(parser, 1, 0);
330 case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
331 return yaml_parser_parse_node(parser, 1, 1);
333 case YAML_PARSE_FLOW_NODE_STATE:
334 return yaml_parser_parse_node(parser, 0, 0);
336 case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
337 return yaml_parser_parse_block_sequence_entry(parser, 1);
339 case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
340 return yaml_parser_parse_block_sequence_entry(parser, 0);
342 case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
343 return yaml_parser_parse_indentless_sequence_entry(parser);
345 case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
346 return yaml_parser_parse_block_mapping_key(parser, 1);
348 case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
349 return yaml_parser_parse_block_mapping_key(parser, 0);
351 case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
352 return yaml_parser_parse_block_mapping_value(parser);
354 case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
355 return yaml_parser_parse_flow_sequence_entry(parser, 1);
357 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
358 return yaml_parser_parse_flow_sequence_entry(parser, 0);
360 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
361 return yaml_parser_parse_flow_sequence_entry_mapping_key(parser);
363 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
364 return yaml_parser_parse_flow_sequence_entry_mapping_value(parser);
366 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
367 return yaml_parser_parse_flow_sequence_entry_mapping_end(parser);
369 case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
370 return yaml_parser_parse_flow_mapping_key(parser, 1);
372 case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
373 return yaml_parser_parse_flow_mapping_key(parser, 0);
375 case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
376 return yaml_parser_parse_flow_mapping_value(parser, 0);
378 case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
379 return yaml_parser_parse_flow_mapping_value(parser, 1);
385 * Parse the production:
386 * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
390 static yaml_event_t *
391 yaml_parser_parse_stream_start(yaml_parser_t *parser)
396 token = yaml_parser_get_token(parser);
397 if (!token) return NULL;
399 assert(token->type == YAML_STREAM_START_TOKEN);
401 event = yaml_stream_start_event_new(token->data.stream_start.encoding,
402 token->start_mark, token->start_mark);
403 yaml_token_delete(token);
405 parser->error = YAML_MEMORY_ERROR;
409 parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
415 * Parse the productions:
416 * implicit_document ::= block_node DOCUMENT-END*
418 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
419 * *************************
422 static yaml_event_t *
423 yaml_parser_parse_document_start(yaml_parser_t *parser, int implicit)
428 token = yaml_parser_peek_token(parser);
429 if (!token) return NULL;
431 /* Parse an implicit document. */
433 if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
434 token->type != YAML_TAG_DIRECTIVE_TOKEN &&
435 token->type != YAML_DOCUMENT_START_TOKEN &&
436 token->type != YAML_STREAM_END_TOKEN)
438 if (!yaml_parser_process_directives(parser)) return NULL;
439 if (!yaml_parser_append_state(parser, YAML_PARSE_DOCUMENT_END_STATE))
441 parser->state = YAML_PARSE_BLOCK_NODE_STATE;
442 event = yaml_document_start_event_new(
443 parser->version_directive, parser->tag_directives, 1,
444 token->start_mark, token->start_mark);
446 parser->error = YAML_MEMORY_ERROR;
452 /* Parse an explicit document. */
454 else if (token->type != YAML_STREAM_END_TOKEN)
456 yaml_mark_t start_mark, end_mark;
457 start_mark = token->start_mark;
458 if (!yaml_parser_process_directives(parser)) return NULL;
459 token = yaml_parser_peek_token(parser);
460 if (!token) return NULL;
461 if (token->type != YAML_DOCUMENT_START_TOKEN) {
462 yaml_parser_set_parser_error(parser,
463 "did not found expected <document start>", token->start_mark);
466 token = yaml_parser_get_token(parser);
467 end_mark = token->end_mark;
468 yaml_token_delete(token);
469 if (!yaml_parser_append_state(parser, YAML_PARSE_DOCUMENT_END_STATE))
471 parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
472 event = yaml_document_start_event_new(
473 parser->version_directive, parser->tag_directives, 0,
474 start_mark, end_mark);
476 parser->error = YAML_MEMORY_ERROR;
482 /* Parse the stream end. */
486 token = yaml_parser_get_token(parser);
487 parser->state = YAML_PARSE_END_STATE;
488 event = yaml_stream_end_event_new(token->start_mark, token->end_mark);
489 yaml_token_delete(token);
491 parser->error = YAML_MEMORY_ERROR;
499 * Parse the productions:
500 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
504 static yaml_event_t *
505 yaml_parser_parse_document_content(yaml_parser_t *parser)
509 token = yaml_parser_peek_token(parser);
510 if (!token) return NULL;
512 if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
513 token->type == YAML_TAG_DIRECTIVE_TOKEN ||
514 token->type == YAML_DOCUMENT_START_TOKEN ||
515 token->type == YAML_DOCUMENT_END_TOKEN ||
516 token->type == YAML_STREAM_END_TOKEN) {
517 parser->state = parser->states[--parser->states_length];
518 return yaml_parser_process_empty_scalar(parser, token->start_mark);
521 return yaml_parser_parse_node(parser, 1, 0);
526 * Parse the productions:
527 * implicit_document ::= block_node DOCUMENT-END*
529 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
533 static yaml_event_t *
534 yaml_parser_parse_document_end(yaml_parser_t *parser)
538 yaml_mark_t start_mark, end_mark;
541 token = yaml_parser_peek_token(parser);
542 if (!token) return NULL;
544 start_mark = end_mark = token->start_mark;
546 while (token->type == YAML_DOCUMENT_END_TOKEN) {
547 end_mark = token->end_mark;
548 yaml_token_delete(yaml_parser_get_token(parser));
549 token = yaml_parser_peek_token(parser);
550 if (!token) return NULL;
554 parser->version_directive = NULL;
555 parser->tag_directives = NULL;
556 parser->tag_directives = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_tag_directive_t *));
557 if (!parser->tag_directives) {
558 parser->error = YAML_MEMORY_ERROR;
561 memset(parser->tag_directives, 0, YAML_DEFAULT_SIZE*sizeof(yaml_tag_directive_t *));
562 parser->tag_directives_size = YAML_DEFAULT_SIZE;
563 parser->tag_directives_length = 0;
567 event = yaml_document_end_event_new(implicit, start_mark, end_mark);
569 parser->error = YAML_MEMORY_ERROR;
572 parser->state = YAML_PARSE_DOCUMENT_START_STATE;
578 * Parse the productions:
579 * block_node_or_indentless_sequence ::=
582 * | properties (block_content | indentless_block_sequence)?
584 * | block_content | indentless_block_sequence
586 * block_node ::= ALIAS
588 * | properties block_content?
592 * flow_node ::= ALIAS
594 * | properties flow_content?
598 * properties ::= TAG ANCHOR? | ANCHOR TAG?
599 * *************************
600 * block_content ::= block_collection | flow_collection | SCALAR
602 * flow_content ::= flow_collection | SCALAR
606 static yaml_event_t *
607 yaml_parser_parse_node(yaml_parser_t *parser,
608 int block, int indentless_sequence)
612 yaml_char_t *anchor = NULL;
613 yaml_char_t *tag_handle = NULL;
614 yaml_char_t *tag_suffix = NULL;
615 yaml_char_t *tag = NULL;
616 yaml_mark_t start_mark, end_mark, tag_mark;
619 token = yaml_parser_peek_token(parser);
620 if (!token) return NULL;
622 if (token->type == YAML_ALIAS_TOKEN)
624 parser->state = parser->states[--parser->states_length];
625 token = yaml_parser_get_token(parser);
626 event = yaml_alias_event_new(token->data.alias.value,
627 token->start_mark, token->end_mark);
629 yaml_token_delete(token);
630 parser->error = YAML_MEMORY_ERROR;
639 start_mark = end_mark = token->start_mark;
641 if (token->type == YAML_ANCHOR_TOKEN)
643 token = yaml_parser_get_token(parser);
644 anchor = token->data.anchor.value;
645 start_mark = token->start_mark;
646 end_mark = token->end_mark;
648 token = yaml_parser_peek_token(parser);
649 if (!token) goto error;
650 if (token->type == YAML_TAG_TOKEN)
652 token = yaml_parser_get_token(parser);
653 tag_handle = token->data.tag.handle;
654 tag_suffix = token->data.tag.suffix;
655 tag_mark = token->start_mark;
656 end_mark = token->end_mark;
658 token = yaml_parser_peek_token(parser);
659 if (!token) goto error;
662 else if (token->type == YAML_TAG_TOKEN)
664 token = yaml_parser_get_token(parser);
665 tag_handle = token->data.tag.handle;
666 tag_suffix = token->data.tag.suffix;
667 start_mark = tag_mark = token->start_mark;
668 end_mark = token->end_mark;
670 token = yaml_parser_peek_token(parser);
671 if (!token) goto error;
672 if (token->type == YAML_ANCHOR_TOKEN)
674 token = yaml_parser_get_token(parser);
675 anchor = token->data.anchor.value;
676 end_mark = token->end_mark;
678 token = yaml_parser_peek_token(parser);
679 if (!token) goto error;
686 yaml_free(tag_handle);
687 tag_handle = tag_suffix = NULL;
690 yaml_tag_directive_t **tag_directive = parser->tag_directives;
691 for (tag_directive = parser->tag_directives;
692 *tag_directive; tag_directive++) {
693 if (strcmp((char *)(*tag_directive)->handle, (char *)tag_handle) == 0) {
694 size_t prefix_len = strlen((char *)(*tag_directive)->prefix);
695 size_t suffix_len = strlen((char *)tag_suffix);
696 tag = yaml_malloc(prefix_len+suffix_len+1);
698 parser->error = YAML_MEMORY_ERROR;
701 memcpy(tag, (*tag_directive)->prefix, prefix_len);
702 memcpy(tag+prefix_len, tag_suffix, suffix_len);
703 tag[prefix_len+suffix_len] = '\0';
704 yaml_free(tag_handle);
705 yaml_free(tag_suffix);
706 tag_handle = tag_suffix = NULL;
710 if (!*tag_directive) {
711 yaml_parser_set_parser_error_context(parser,
712 "while parsing a node", start_mark,
713 "found undefined tag handle", tag_mark);
719 implicit = (!tag || !*tag);
720 if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
721 end_mark = token->end_mark;
722 parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
723 event = yaml_sequence_start_event_new(anchor, tag, implicit,
724 YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
725 if (!event) goto error;
729 if (token->type == YAML_SCALAR_TOKEN) {
730 int plain_implicit = 0;
731 int quoted_implicit = 0;
732 token = yaml_parser_get_token(parser);
733 end_mark = token->end_mark;
734 if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
735 || (tag && strcmp((char *)tag, "!") == 0)) {
741 parser->state = parser->states[--parser->states_length];
742 event = yaml_scalar_event_new(anchor, tag,
743 token->data.scalar.value, token->data.scalar.length,
744 plain_implicit, quoted_implicit,
745 token->data.scalar.style, start_mark, end_mark);
747 parser->error = YAML_MEMORY_ERROR;
748 yaml_token_delete(token);
753 else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
754 end_mark = token->end_mark;
755 parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
756 event = yaml_sequence_start_event_new(anchor, tag, implicit,
757 YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
759 parser->error = YAML_MEMORY_ERROR;
763 else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
764 end_mark = token->end_mark;
765 parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
766 event = yaml_mapping_start_event_new(anchor, tag, implicit,
767 YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
769 parser->error = YAML_MEMORY_ERROR;
773 else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
774 end_mark = token->end_mark;
775 parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
776 event = yaml_sequence_start_event_new(anchor, tag, implicit,
777 YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
779 parser->error = YAML_MEMORY_ERROR;
783 else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
784 end_mark = token->end_mark;
785 parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
786 event = yaml_mapping_start_event_new(anchor, tag, implicit,
787 YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
789 parser->error = YAML_MEMORY_ERROR;
793 else if (anchor || tag) {
794 yaml_char_t *value = yaml_malloc(1);
796 parser->error = YAML_MEMORY_ERROR;
800 parser->state = parser->states[--parser->states_length];
801 event = yaml_scalar_event_new(anchor, tag, value, 0,
802 implicit, 0, YAML_PLAIN_SCALAR_STYLE,
803 start_mark, end_mark);
806 parser->error = YAML_MEMORY_ERROR;
811 yaml_parser_set_parser_error_context(parser,
812 (block ? "while parsing a block node"
813 : "while parsing a flow node"), start_mark,
814 "did not found expected node content", token->start_mark);
823 yaml_free(tag_handle);
824 yaml_free(tag_suffix);
831 * Parse the productions:
832 * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
833 * ******************** *********** * *********
836 static yaml_event_t *
837 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, int first)
843 token = yaml_parser_get_token(parser);
844 if (!yaml_parser_append_mark(parser, token->start_mark)) {
845 yaml_token_delete(token);
848 yaml_token_delete(token);
851 token = yaml_parser_get_token(parser);
852 if (!token) return NULL;
854 if (token->type == YAML_BLOCK_ENTRY_TOKEN)
856 yaml_mark_t mark = token->end_mark;
857 yaml_token_delete(token);
858 token = yaml_parser_peek_token(parser);
859 if (!token) return NULL;
860 if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
861 token->type != YAML_BLOCK_END_TOKEN) {
862 if (!yaml_parser_append_state(parser,
863 YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
865 return yaml_parser_parse_node(parser, 1, 0);
868 parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
869 return yaml_parser_process_empty_scalar(parser, mark);
873 else if (token->type == YAML_BLOCK_END_TOKEN)
875 parser->state = parser->states[--parser->states_length];
876 parser->marks_length --;
877 event = yaml_sequence_end_event_new(token->start_mark, token->end_mark);
878 yaml_token_delete(token);
880 parser->error = YAML_MEMORY_ERROR;
888 yaml_parser_set_parser_error_context(parser,
889 "while parsing a block collection", parser->marks[parser->marks_length-1],
890 "did not found expected '-' indicator", token->start_mark);
891 yaml_token_delete(token);
897 * Parse the productions:
898 * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
902 static yaml_event_t *
903 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser)
908 token = yaml_parser_peek_token(parser);
909 if (!token) return NULL;
911 if (token->type == YAML_BLOCK_ENTRY_TOKEN)
913 yaml_mark_t mark = token->end_mark;
914 yaml_token_delete(yaml_parser_get_token(parser));
915 token = yaml_parser_peek_token(parser);
916 if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
917 token->type != YAML_BLOCK_END_TOKEN) {
918 if (!yaml_parser_append_state(parser,
919 YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
921 return yaml_parser_parse_node(parser, 1, 0);
924 parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
925 return yaml_parser_process_empty_scalar(parser, mark);
931 parser->state = parser->states[--parser->states_length];
932 event = yaml_sequence_end_event_new(token->start_mark, token->start_mark);
934 parser->error = YAML_MEMORY_ERROR;
942 * Parse the productions:
943 * block_mapping ::= BLOCK-MAPPING_START
944 * *******************
945 * ((KEY block_node_or_indentless_sequence?)?
947 * (VALUE block_node_or_indentless_sequence?)?)*
953 static yaml_event_t *
954 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, int first)
960 token = yaml_parser_get_token(parser);
961 if (!yaml_parser_append_mark(parser, token->start_mark)) {
962 yaml_token_delete(token);
965 yaml_token_delete(token);
968 token = yaml_parser_get_token(parser);
969 if (!token) return NULL;
971 if (token->type == YAML_KEY_TOKEN)
973 yaml_mark_t mark = token->end_mark;
974 yaml_token_delete(token);
975 token = yaml_parser_peek_token(parser);
976 if (!token) return NULL;
977 if (token->type != YAML_KEY_TOKEN &&
978 token->type != YAML_VALUE_TOKEN &&
979 token->type != YAML_BLOCK_END_TOKEN) {
980 if (!yaml_parser_append_state(parser,
981 YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
983 return yaml_parser_parse_node(parser, 1, 1);
986 parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
987 return yaml_parser_process_empty_scalar(parser, mark);
991 else if (token->type == YAML_BLOCK_END_TOKEN)
993 parser->state = parser->states[--parser->states_length];
994 parser->marks_length --;
995 event = yaml_mapping_end_event_new(token->start_mark, token->end_mark);
996 yaml_token_delete(token);
998 parser->error = YAML_MEMORY_ERROR;
1006 yaml_parser_set_parser_error_context(parser,
1007 "while parsing a block mapping", parser->marks[parser->marks_length-1],
1008 "did not found expected key", token->start_mark);
1009 yaml_token_delete(token);
1015 * Parse the productions:
1016 * block_mapping ::= BLOCK-MAPPING_START
1018 * ((KEY block_node_or_indentless_sequence?)?
1020 * (VALUE block_node_or_indentless_sequence?)?)*
1026 static yaml_event_t *
1027 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser)
1029 yaml_token_t *token;
1030 yaml_event_t *event;
1032 token = yaml_parser_peek_token(parser);
1033 if (!token) return NULL;
1035 if (token->type == YAML_VALUE_TOKEN)
1037 yaml_mark_t mark = token->end_mark;
1038 yaml_token_delete(yaml_parser_get_token(parser));
1039 token = yaml_parser_peek_token(parser);
1040 if (!token) return NULL;
1041 if (token->type != YAML_KEY_TOKEN &&
1042 token->type != YAML_VALUE_TOKEN &&
1043 token->type != YAML_BLOCK_END_TOKEN) {
1044 if (!yaml_parser_append_state(parser,
1045 YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
1047 return yaml_parser_parse_node(parser, 1, 1);
1050 parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
1051 return yaml_parser_process_empty_scalar(parser, mark);
1057 parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
1058 return yaml_parser_process_empty_scalar(parser, token->start_mark);
1063 * Parse the productions:
1064 * flow_sequence ::= FLOW-SEQUENCE-START
1065 * *******************
1066 * (flow_sequence_entry FLOW-ENTRY)*
1068 * flow_sequence_entry?
1072 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1076 static yaml_event_t *
1077 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, int first)
1079 yaml_token_t *token;
1080 yaml_event_t *event;
1083 token = yaml_parser_get_token(parser);
1084 if (!yaml_parser_append_mark(parser, token->start_mark)) {
1085 yaml_token_delete(token);
1088 yaml_token_delete(token);
1091 token = yaml_parser_peek_token(parser);
1092 if (!token) return NULL;
1094 if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN)
1097 if (token->type == YAML_FLOW_ENTRY_TOKEN) {
1098 yaml_token_delete(yaml_parser_get_token(parser));
1099 token = yaml_parser_peek_token(parser);
1100 if (!token) return NULL;
1103 yaml_parser_set_parser_error_context(parser,
1104 "while parsing a flow sequence", parser->marks[parser->marks_length-1],
1105 "did not found expected ',' or ']'", token->start_mark);
1110 if (token->type == YAML_KEY_TOKEN) {
1111 token = yaml_parser_get_token(parser);
1112 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE;
1113 event = yaml_mapping_start_event_new(NULL, NULL,
1114 1, YAML_FLOW_MAPPING_STYLE,
1115 token->start_mark, token->end_mark);
1116 yaml_token_delete(token);
1120 else if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1121 if (!yaml_parser_append_state(parser,
1122 YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE))
1124 return yaml_parser_parse_node(parser, 0, 0);
1128 parser->state = parser->states[--parser->states_length];
1129 parser->marks_length --;
1130 token = yaml_parser_get_token(parser);
1131 event = yaml_sequence_end_event_new(token->start_mark, token->end_mark);
1132 yaml_token_delete(token);
1137 * Parse the productions:
1138 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1142 static yaml_event_t *
1143 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser)
1145 yaml_token_t *token;
1146 yaml_event_t *event;
1148 token = yaml_parser_peek_token(parser);
1149 if (!token) return NULL;
1151 if (token->type != YAML_VALUE_TOKEN && token->type != YAML_FLOW_ENTRY_TOKEN
1152 && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1153 if (!yaml_parser_append_state(parser,
1154 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE))
1156 return yaml_parser_parse_node(parser, 0, 0);
1159 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE;
1160 event = yaml_parser_process_empty_scalar(parser, token->end_mark);
1161 yaml_token_delete(token);
1167 * Parse the productions:
1168 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1172 static yaml_event_t *
1173 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser)
1175 yaml_token_t *token;
1177 token = yaml_parser_peek_token(parser);
1178 if (!token) return NULL;
1180 if (token->type == YAML_VALUE_TOKEN) {
1181 yaml_token_delete(yaml_parser_get_token(parser));
1182 token = yaml_parser_peek_token(parser);
1183 if (!token) return NULL;
1184 if (token->type != YAML_FLOW_ENTRY_TOKEN
1185 && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1186 if (!yaml_parser_append_state(parser,
1187 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE))
1189 return yaml_parser_parse_node(parser, 0, 0);
1192 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE;
1193 return yaml_parser_process_empty_scalar(parser, token->start_mark);
1197 * Parse the productions:
1198 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1202 static yaml_event_t *
1203 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser)
1205 yaml_token_t *token;
1207 token = yaml_parser_peek_token(parser);
1208 if (!token) return NULL;
1210 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE;
1212 return yaml_mapping_end_event_new(token->start_mark, token->start_mark);
1216 * Parse the productions:
1217 * flow_mapping ::= FLOW-MAPPING-START
1218 * ******************
1219 * (flow_mapping_entry FLOW-ENTRY)*
1221 * flow_mapping_entry?
1222 * ******************
1225 * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1229 static yaml_event_t *
1230 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, int first)
1232 yaml_token_t *token;
1233 yaml_event_t *event;
1236 token = yaml_parser_get_token(parser);
1237 if (!yaml_parser_append_mark(parser, token->start_mark)) {
1238 yaml_token_delete(token);
1241 yaml_token_delete(token);
1244 token = yaml_parser_peek_token(parser);
1247 if (token->type != YAML_FLOW_MAPPING_END_TOKEN)
1250 if (token->type == YAML_FLOW_ENTRY_TOKEN) {
1251 yaml_token_delete(yaml_parser_get_token(parser));
1252 token = yaml_parser_peek_token(parser);
1256 yaml_parser_set_parser_error_context(parser,
1257 "while parsing a flow mapping", parser->marks[parser->marks_length-1],
1258 "did not found expected ',' or '}'", token->start_mark);
1263 if (token->type == YAML_KEY_TOKEN) {
1264 yaml_token_delete(yaml_parser_get_token(parser));
1265 token = yaml_parser_peek_token(parser);
1266 if (!token) return NULL;
1267 if (token->type != YAML_VALUE_TOKEN
1268 && token->type != YAML_FLOW_ENTRY_TOKEN
1269 && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1270 if (!yaml_parser_append_state(parser,
1271 YAML_PARSE_FLOW_MAPPING_VALUE_STATE))
1273 return yaml_parser_parse_node(parser, 0, 0);
1276 parser->state = YAML_PARSE_FLOW_MAPPING_VALUE_STATE;
1277 return yaml_parser_process_empty_scalar(parser, token->start_mark);
1280 else if (token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1281 if (!yaml_parser_append_state(parser,
1282 YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE))
1284 return yaml_parser_parse_node(parser, 0, 0);
1288 parser->state = parser->states[--parser->states_length];
1289 parser->marks_length --;
1290 token = yaml_parser_get_token(parser);
1291 event = yaml_mapping_end_event_new(token->start_mark, token->end_mark);
1292 yaml_token_delete(token);
1297 * Parse the productions:
1298 * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1302 static yaml_event_t *
1303 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser, int empty)
1305 yaml_token_t *token;
1306 yaml_event_t *event;
1308 token = yaml_parser_peek_token(parser);
1312 parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1313 return yaml_parser_process_empty_scalar(parser, token->start_mark);
1316 if (token->type == YAML_VALUE_TOKEN) {
1317 yaml_token_delete(yaml_parser_get_token(parser));
1318 token = yaml_parser_peek_token(parser);
1319 if (!token) return NULL;
1320 if (token->type != YAML_FLOW_ENTRY_TOKEN
1321 && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1322 if (!yaml_parser_append_state(parser,
1323 YAML_PARSE_FLOW_MAPPING_KEY_STATE))
1325 return yaml_parser_parse_node(parser, 0, 0);
1329 parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1330 return yaml_parser_process_empty_scalar(parser, token->start_mark);
1334 * Generate an empty scalar event.
1337 static yaml_event_t *
1338 yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_mark_t mark)
1340 yaml_event_t *event;
1343 value = yaml_malloc(1);
1345 parser->error = YAML_MEMORY_ERROR;
1350 event = yaml_scalar_event_new(NULL, NULL, value, 0,
1351 1, 0, YAML_PLAIN_SCALAR_STYLE, mark, mark);
1354 parser->error = YAML_MEMORY_ERROR;
1366 yaml_parser_process_directives(yaml_parser_t *parser)
1368 yaml_tag_directive_t default_tag_directives[] = {
1369 {(yaml_char_t *)"!", (yaml_char_t *)"!"},
1370 {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
1373 yaml_tag_directive_t *ref;
1374 yaml_tag_directive_t *default_tag_directive;
1375 yaml_tag_directive_t **tag_directive;
1376 yaml_token_t *token;
1378 token = yaml_parser_peek_token(parser);
1379 if (!token) return 0;
1381 while (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
1382 token->type == YAML_TAG_DIRECTIVE_TOKEN)
1384 if (token->type == YAML_VERSION_DIRECTIVE_TOKEN) {
1385 if (parser->version_directive) {
1386 return yaml_parser_set_parser_error(parser,
1387 "found duplicate %YAML directive", token->start_mark);
1389 if (token->data.version_directive.major != 1
1390 && token->data.version_directive.minor != 1) {
1391 return yaml_parser_set_parser_error(parser,
1392 "found incompatible YAML document", token->start_mark);
1394 parser->version_directive = yaml_malloc(sizeof(yaml_version_directive_t));
1395 if (!parser->version_directive) {
1396 parser->error = YAML_MEMORY_ERROR;
1399 parser->version_directive->major = token->data.version_directive.major;
1400 parser->version_directive->minor = token->data.version_directive.minor;
1403 else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
1404 yaml_tag_directive_t value = {
1405 token->data.tag_directive.handle,
1406 token->data.tag_directive.prefix
1408 for (tag_directive = parser->tag_directives;
1409 *tag_directive; tag_directive++) {
1410 if (strcmp((char *)value.handle,
1411 (char *)(*tag_directive)->handle) == 0) {
1412 return yaml_parser_set_parser_error(parser,
1413 "found duplicate %TAG directive", token->start_mark);
1416 ref = yaml_malloc(sizeof(yaml_tag_directive_t));
1418 parser->error = YAML_MEMORY_ERROR;
1422 if (!yaml_parser_append_tag_directive(parser, ref)) {
1427 yaml_free(yaml_parser_get_token(parser));
1428 token = yaml_parser_peek_token(parser);
1429 if (!token) return 0;
1432 for (default_tag_directive = default_tag_directives;
1433 default_tag_directive->handle; default_tag_directive++) {
1435 for (tag_directive = parser->tag_directives;
1436 *tag_directive; tag_directive++) {
1437 if (strcmp((char *)default_tag_directive->handle,
1438 (char *)(*tag_directive)->handle) == 0) {
1444 ref = yaml_malloc(sizeof(yaml_tag_directive_t));
1446 parser->error = YAML_MEMORY_ERROR;
1449 ref->handle = yaml_malloc(strlen((char *)default_tag_directive->handle)+1);
1452 parser->error = YAML_MEMORY_ERROR;
1455 ref->prefix = yaml_malloc(strlen((char *)default_tag_directive->prefix)+1);
1457 yaml_free(ref->handle);
1459 parser->error = YAML_MEMORY_ERROR;
1462 memcpy(ref->handle, default_tag_directive->handle,
1463 strlen((char *)default_tag_directive->handle)+1);
1464 memcpy(ref->prefix, default_tag_directive->prefix,
1465 strlen((char *)default_tag_directive->prefix)+1);
1466 if (!yaml_parser_append_tag_directive(parser, ref)) {