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?)?
42 #include "yaml_private.h"
45 * Peek the next token in the token queue.
48 #define PEEK_TOKEN(parser) \
49 ((parser->token_available || yaml_parser_fetch_more_tokens(parser)) ? \
50 parser->tokens.head : NULL)
53 * Remove the next token from the queue (must be called after PEEK_TOKEN).
56 #define SKIP_TOKEN(parser) \
57 (parser->token_available = 0, \
58 parser->tokens_parsed ++, \
59 parser->stream_end_produced = \
60 (parser->tokens.head->type == YAML_STREAM_END_TOKEN), \
61 parser->tokens.head ++)
64 * Public API declarations.
68 yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event);
75 yaml_parser_set_parser_error(yaml_parser_t *parser,
76 const char *problem, yaml_mark_t problem_mark);
79 yaml_parser_set_parser_error_context(yaml_parser_t *parser,
80 const char *context, yaml_mark_t context_mark,
81 const char *problem, yaml_mark_t problem_mark);
88 yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event);
91 yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event);
94 yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
98 yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event);
101 yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event);
104 yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
105 int block, int indentless_sequence);
108 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
109 yaml_event_t *event, int first);
112 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
113 yaml_event_t *event);
116 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
117 yaml_event_t *event, int first);
120 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
121 yaml_event_t *event);
124 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
125 yaml_event_t *event, int first);
128 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
129 yaml_event_t *event);
132 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
133 yaml_event_t *event);
136 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
137 yaml_event_t *event);
140 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
141 yaml_event_t *event, int first);
144 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
145 yaml_event_t *event, int empty);
152 yaml_parser_process_empty_scalar(yaml_parser_t *parser,
153 yaml_event_t *event, yaml_mark_t mark);
156 yaml_parser_process_directives(yaml_parser_t *parser,
157 yaml_version_directive_t **version_directive_ref,
158 yaml_tag_directive_t **tag_directives_start_ref,
159 yaml_tag_directive_t **tag_directives_end_ref);
162 yaml_parser_append_tag_directive(yaml_parser_t *parser,
163 yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark);
166 * Get the next event.
170 yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event)
172 assert(parser); /* Non-NULL parser object is expected. */
173 assert(event); /* Non-NULL event object is expected. */
175 /* Erase the event object. */
177 memset(event, 0, sizeof(yaml_event_t));
179 /* No events after the end of the stream or error. */
181 if (parser->stream_end_produced || parser->error ||
182 parser->state == YAML_PARSE_END_STATE) {
186 /* Generate the next event. */
188 return yaml_parser_state_machine(parser, event);
196 yaml_parser_set_parser_error(yaml_parser_t *parser,
197 const char *problem, yaml_mark_t problem_mark)
199 parser->error = YAML_PARSER_ERROR;
200 parser->problem = problem;
201 parser->problem_mark = problem_mark;
207 yaml_parser_set_parser_error_context(yaml_parser_t *parser,
208 const char *context, yaml_mark_t context_mark,
209 const char *problem, yaml_mark_t problem_mark)
211 parser->error = YAML_PARSER_ERROR;
212 parser->context = context;
213 parser->context_mark = context_mark;
214 parser->problem = problem;
215 parser->problem_mark = problem_mark;
226 yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event)
228 switch (parser->state)
230 case YAML_PARSE_STREAM_START_STATE:
231 return yaml_parser_parse_stream_start(parser, event);
233 case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
234 return yaml_parser_parse_document_start(parser, event, 1);
236 case YAML_PARSE_DOCUMENT_START_STATE:
237 return yaml_parser_parse_document_start(parser, event, 0);
239 case YAML_PARSE_DOCUMENT_CONTENT_STATE:
240 return yaml_parser_parse_document_content(parser, event);
242 case YAML_PARSE_DOCUMENT_END_STATE:
243 return yaml_parser_parse_document_end(parser, event);
245 case YAML_PARSE_BLOCK_NODE_STATE:
246 return yaml_parser_parse_node(parser, event, 1, 0);
248 case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
249 return yaml_parser_parse_node(parser, event, 1, 1);
251 case YAML_PARSE_FLOW_NODE_STATE:
252 return yaml_parser_parse_node(parser, event, 0, 0);
254 case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
255 return yaml_parser_parse_block_sequence_entry(parser, event, 1);
257 case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
258 return yaml_parser_parse_block_sequence_entry(parser, event, 0);
260 case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
261 return yaml_parser_parse_indentless_sequence_entry(parser, event);
263 case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
264 return yaml_parser_parse_block_mapping_key(parser, event, 1);
266 case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
267 return yaml_parser_parse_block_mapping_key(parser, event, 0);
269 case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
270 return yaml_parser_parse_block_mapping_value(parser, event);
272 case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
273 return yaml_parser_parse_flow_sequence_entry(parser, event, 1);
275 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
276 return yaml_parser_parse_flow_sequence_entry(parser, event, 0);
278 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
279 return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event);
281 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
282 return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event);
284 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
285 return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event);
287 case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
288 return yaml_parser_parse_flow_mapping_key(parser, event, 1);
290 case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
291 return yaml_parser_parse_flow_mapping_key(parser, event, 0);
293 case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
294 return yaml_parser_parse_flow_mapping_value(parser, event, 0);
296 case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
297 return yaml_parser_parse_flow_mapping_value(parser, event, 1);
300 assert(1); /* Invalid state. */
307 * Parse the production:
308 * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
313 yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event)
317 token = PEEK_TOKEN(parser);
318 if (!token) return 0;
320 if (token->type != YAML_STREAM_START_TOKEN) {
321 return yaml_parser_set_parser_error(parser,
322 "did not found expected <stream-start>", token->start_mark);
325 parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
326 STREAM_START_EVENT_INIT(*event, token->data.stream_start.encoding,
327 token->start_mark, token->start_mark);
334 * Parse the productions:
335 * implicit_document ::= block_node DOCUMENT-END*
337 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
338 * *************************
342 yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
346 yaml_version_directive_t *version_directive = NULL;
348 yaml_tag_directive_t *start;
349 yaml_tag_directive_t *end;
350 } tag_directives = { NULL, NULL };
352 token = PEEK_TOKEN(parser);
353 if (!token) return 0;
355 /* Parse an implicit document. */
357 if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
358 token->type != YAML_TAG_DIRECTIVE_TOKEN &&
359 token->type != YAML_DOCUMENT_START_TOKEN &&
360 token->type != YAML_STREAM_END_TOKEN)
362 if (!yaml_parser_process_directives(parser, NULL, NULL, NULL))
364 if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
366 parser->state = YAML_PARSE_BLOCK_NODE_STATE;
367 DOCUMENT_START_EVENT_INIT(*event, NULL, NULL, NULL, 1,
368 token->start_mark, token->start_mark);
372 /* Parse an explicit document. */
374 else if (token->type != YAML_STREAM_END_TOKEN)
376 yaml_mark_t start_mark, end_mark;
377 start_mark = token->start_mark;
378 if (!yaml_parser_process_directives(parser, &version_directive,
379 &tag_directives.start, &tag_directives.end))
381 token = PEEK_TOKEN(parser);
382 if (!token) goto error;
383 if (token->type != YAML_DOCUMENT_START_TOKEN) {
384 yaml_parser_set_parser_error(parser,
385 "did not found expected <document start>", token->start_mark);
388 if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
390 parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
391 end_mark = token->end_mark;
392 DOCUMENT_START_EVENT_INIT(*event, version_directive,
393 tag_directives.start, tag_directives.end, 0,
394 start_mark, end_mark);
396 version_directive = NULL;
397 tag_directives.start = tag_directives.end = NULL;
401 /* Parse the stream end. */
405 parser->state = YAML_PARSE_END_STATE;
406 STREAM_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
412 yaml_free(version_directive);
413 while (tag_directives.start != tag_directives.end) {
414 yaml_free(tag_directives.end[-1].handle);
415 yaml_free(tag_directives.end[-1].prefix);
416 tag_directives.end --;
418 yaml_free(tag_directives.start);
423 * Parse the productions:
424 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
429 yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event)
433 token = PEEK_TOKEN(parser);
434 if (!token) return 0;
436 if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
437 token->type == YAML_TAG_DIRECTIVE_TOKEN ||
438 token->type == YAML_DOCUMENT_START_TOKEN ||
439 token->type == YAML_DOCUMENT_END_TOKEN ||
440 token->type == YAML_STREAM_END_TOKEN) {
441 parser->state = POP(parser, parser->states);
442 return yaml_parser_process_empty_scalar(parser, event,
446 return yaml_parser_parse_node(parser, event, 1, 0);
451 * Parse the productions:
452 * implicit_document ::= block_node DOCUMENT-END*
454 * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
459 yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event)
462 yaml_mark_t start_mark, end_mark;
465 token = PEEK_TOKEN(parser);
466 if (!token) return 0;
468 start_mark = end_mark = token->start_mark;
470 while (token->type == YAML_DOCUMENT_END_TOKEN) {
471 end_mark = token->end_mark;
473 token = PEEK_TOKEN(parser);
474 if (!token) return 0;
478 while (!STACK_EMPTY(parser, parser->tag_directives)) {
479 yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
480 yaml_free(tag_directive.handle);
481 yaml_free(tag_directive.prefix);
484 parser->state = YAML_PARSE_DOCUMENT_START_STATE;
485 DOCUMENT_END_EVENT_INIT(*event, implicit, start_mark, end_mark);
491 * Parse the productions:
492 * block_node_or_indentless_sequence ::=
495 * | properties (block_content | indentless_block_sequence)?
497 * | block_content | indentless_block_sequence
499 * block_node ::= ALIAS
501 * | properties block_content?
505 * flow_node ::= ALIAS
507 * | properties flow_content?
511 * properties ::= TAG ANCHOR? | ANCHOR TAG?
512 * *************************
513 * block_content ::= block_collection | flow_collection | SCALAR
515 * flow_content ::= flow_collection | SCALAR
520 yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
521 int block, int indentless_sequence)
524 yaml_char_t *anchor = NULL;
525 yaml_char_t *tag_handle = NULL;
526 yaml_char_t *tag_suffix = NULL;
527 yaml_char_t *tag = NULL;
528 yaml_mark_t start_mark, end_mark, tag_mark;
531 token = PEEK_TOKEN(parser);
532 if (!token) return 0;
534 if (token->type == YAML_ALIAS_TOKEN)
536 parser->state = POP(parser, parser->states);
537 ALIAS_EVENT_INIT(*event, token->data.alias.value,
538 token->start_mark, token->end_mark);
545 start_mark = end_mark = token->start_mark;
547 if (token->type == YAML_ANCHOR_TOKEN)
549 anchor = token->data.anchor.value;
550 start_mark = token->start_mark;
551 end_mark = token->end_mark;
553 token = PEEK_TOKEN(parser);
554 if (!token) goto error;
555 if (token->type == YAML_TAG_TOKEN)
557 tag_handle = token->data.tag.handle;
558 tag_suffix = token->data.tag.suffix;
559 tag_mark = token->start_mark;
560 end_mark = token->end_mark;
562 token = PEEK_TOKEN(parser);
563 if (!token) goto error;
566 else if (token->type == YAML_TAG_TOKEN)
568 tag_handle = token->data.tag.handle;
569 tag_suffix = token->data.tag.suffix;
570 start_mark = tag_mark = token->start_mark;
571 end_mark = token->end_mark;
573 token = PEEK_TOKEN(parser);
574 if (!token) goto error;
575 if (token->type == YAML_ANCHOR_TOKEN)
577 anchor = token->data.anchor.value;
578 end_mark = token->end_mark;
580 token = PEEK_TOKEN(parser);
581 if (!token) goto error;
588 yaml_free(tag_handle);
589 tag_handle = tag_suffix = NULL;
592 yaml_tag_directive_t *tag_directive;
593 for (tag_directive = parser->tag_directives.start;
594 tag_directive != parser->tag_directives.top;
596 if (strcmp((char *)tag_directive->handle, (char *)tag_handle) == 0) {
597 size_t prefix_len = strlen((char *)tag_directive->prefix);
598 size_t suffix_len = strlen((char *)tag_suffix);
599 tag = yaml_malloc(prefix_len+suffix_len+1);
601 parser->error = YAML_MEMORY_ERROR;
604 memcpy(tag, tag_directive->prefix, prefix_len);
605 memcpy(tag+prefix_len, tag_suffix, suffix_len);
606 tag[prefix_len+suffix_len] = '\0';
607 yaml_free(tag_handle);
608 yaml_free(tag_suffix);
609 tag_handle = tag_suffix = NULL;
614 yaml_parser_set_parser_error_context(parser,
615 "while parsing a node", start_mark,
616 "found undefined tag handle", tag_mark);
622 implicit = (!tag || !*tag);
623 if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
624 end_mark = token->end_mark;
625 parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
626 SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
627 YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
631 if (token->type == YAML_SCALAR_TOKEN) {
632 int plain_implicit = 0;
633 int quoted_implicit = 0;
634 end_mark = token->end_mark;
635 if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
636 || (tag && strcmp((char *)tag, "!") == 0)) {
642 parser->state = POP(parser, parser->states);
643 SCALAR_EVENT_INIT(*event, anchor, tag,
644 token->data.scalar.value, token->data.scalar.length,
645 plain_implicit, quoted_implicit,
646 token->data.scalar.style, start_mark, end_mark);
650 else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
651 end_mark = token->end_mark;
652 parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
653 SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
654 YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
657 else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
658 end_mark = token->end_mark;
659 parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
660 MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
661 YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
664 else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
665 end_mark = token->end_mark;
666 parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
667 SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
668 YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
671 else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
672 end_mark = token->end_mark;
673 parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
674 MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
675 YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
678 else if (anchor || tag) {
679 yaml_char_t *value = yaml_malloc(1);
681 parser->error = YAML_MEMORY_ERROR;
685 parser->state = POP(parser, parser->states);
686 SCALAR_EVENT_INIT(*event, anchor, tag, value, 0,
687 implicit, 0, YAML_PLAIN_SCALAR_STYLE,
688 start_mark, end_mark);
692 yaml_parser_set_parser_error_context(parser,
693 (block ? "while parsing a block node"
694 : "while parsing a flow node"), start_mark,
695 "did not found expected node content", token->start_mark);
703 yaml_free(tag_handle);
704 yaml_free(tag_suffix);
711 * Parse the productions:
712 * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
713 * ******************** *********** * *********
717 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
718 yaml_event_t *event, int first)
723 token = PEEK_TOKEN(parser);
724 if (!PUSH(parser, parser->marks, token->start_mark))
729 token = PEEK_TOKEN(parser);
730 if (!token) return 0;
732 if (token->type == YAML_BLOCK_ENTRY_TOKEN)
734 yaml_mark_t mark = token->end_mark;
736 token = PEEK_TOKEN(parser);
737 if (!token) return 0;
738 if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
739 token->type != YAML_BLOCK_END_TOKEN) {
740 if (!PUSH(parser, parser->states,
741 YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
743 return yaml_parser_parse_node(parser, event, 1, 0);
746 parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
747 return yaml_parser_process_empty_scalar(parser, event, mark);
751 else if (token->type == YAML_BLOCK_END_TOKEN)
753 parser->state = POP(parser, parser->states);
754 POP(parser, parser->marks);
755 SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
762 return yaml_parser_set_parser_error_context(parser,
763 "while parsing a block collection", POP(parser, parser->marks),
764 "did not found expected '-' indicator", token->start_mark);
769 * Parse the productions:
770 * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
775 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
780 token = PEEK_TOKEN(parser);
781 if (!token) return 0;
783 if (token->type == YAML_BLOCK_ENTRY_TOKEN)
785 yaml_mark_t mark = token->end_mark;
787 token = PEEK_TOKEN(parser);
788 if (!token) return 0;
789 if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
790 token->type != YAML_KEY_TOKEN &&
791 token->type != YAML_VALUE_TOKEN &&
792 token->type != YAML_BLOCK_END_TOKEN) {
793 if (!PUSH(parser, parser->states,
794 YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
796 return yaml_parser_parse_node(parser, event, 1, 0);
799 parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
800 return yaml_parser_process_empty_scalar(parser, event, mark);
806 parser->state = POP(parser, parser->states);
807 SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
813 * Parse the productions:
814 * block_mapping ::= BLOCK-MAPPING_START
815 * *******************
816 * ((KEY block_node_or_indentless_sequence?)?
818 * (VALUE block_node_or_indentless_sequence?)?)*
825 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
826 yaml_event_t *event, int first)
831 token = PEEK_TOKEN(parser);
832 if (!PUSH(parser, parser->marks, token->start_mark))
837 token = PEEK_TOKEN(parser);
838 if (!token) return 0;
840 if (token->type == YAML_KEY_TOKEN)
842 yaml_mark_t mark = token->end_mark;
844 token = PEEK_TOKEN(parser);
845 if (!token) return 0;
846 if (token->type != YAML_KEY_TOKEN &&
847 token->type != YAML_VALUE_TOKEN &&
848 token->type != YAML_BLOCK_END_TOKEN) {
849 if (!PUSH(parser, parser->states,
850 YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
852 return yaml_parser_parse_node(parser, event, 1, 1);
855 parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
856 return yaml_parser_process_empty_scalar(parser, event, mark);
860 else if (token->type == YAML_BLOCK_END_TOKEN)
862 parser->state = POP(parser, parser->states);
863 POP(parser, parser->marks);
864 MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
871 return yaml_parser_set_parser_error_context(parser,
872 "while parsing a block mapping", POP(parser, parser->marks),
873 "did not found expected key", token->start_mark);
878 * Parse the productions:
879 * block_mapping ::= BLOCK-MAPPING_START
881 * ((KEY block_node_or_indentless_sequence?)?
883 * (VALUE block_node_or_indentless_sequence?)?)*
890 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
895 token = PEEK_TOKEN(parser);
896 if (!token) return 0;
898 if (token->type == YAML_VALUE_TOKEN)
900 yaml_mark_t mark = token->end_mark;
902 token = PEEK_TOKEN(parser);
903 if (!token) return 0;
904 if (token->type != YAML_KEY_TOKEN &&
905 token->type != YAML_VALUE_TOKEN &&
906 token->type != YAML_BLOCK_END_TOKEN) {
907 if (!PUSH(parser, parser->states,
908 YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
910 return yaml_parser_parse_node(parser, event, 1, 1);
913 parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
914 return yaml_parser_process_empty_scalar(parser, event, mark);
920 parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
921 return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
926 * Parse the productions:
927 * flow_sequence ::= FLOW-SEQUENCE-START
928 * *******************
929 * (flow_sequence_entry FLOW-ENTRY)*
931 * flow_sequence_entry?
935 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
940 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
941 yaml_event_t *event, int first)
946 token = PEEK_TOKEN(parser);
947 if (!PUSH(parser, parser->marks, token->start_mark))
952 token = PEEK_TOKEN(parser);
953 if (!token) return 0;
955 if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN)
958 if (token->type == YAML_FLOW_ENTRY_TOKEN) {
960 token = PEEK_TOKEN(parser);
961 if (!token) return 0;
964 return yaml_parser_set_parser_error_context(parser,
965 "while parsing a flow sequence", POP(parser, parser->marks),
966 "did not found expected ',' or ']'", token->start_mark);
970 if (token->type == YAML_KEY_TOKEN) {
971 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE;
972 MAPPING_START_EVENT_INIT(*event, NULL, NULL,
973 1, YAML_FLOW_MAPPING_STYLE,
974 token->start_mark, token->end_mark);
979 else if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
980 if (!PUSH(parser, parser->states,
981 YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE))
983 return yaml_parser_parse_node(parser, event, 0, 0);
987 parser->state = POP(parser, parser->states);
988 POP(parser, parser->marks);
989 SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
995 * Parse the productions:
996 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1001 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
1002 yaml_event_t *event)
1004 yaml_token_t *token;
1006 token = PEEK_TOKEN(parser);
1007 if (!token) return 0;
1009 if (token->type != YAML_VALUE_TOKEN && token->type != YAML_FLOW_ENTRY_TOKEN
1010 && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1011 if (!PUSH(parser, parser->states,
1012 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE))
1014 return yaml_parser_parse_node(parser, event, 0, 0);
1017 yaml_mark_t mark = token->end_mark;
1019 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE;
1020 return yaml_parser_process_empty_scalar(parser, event, mark);
1025 * Parse the productions:
1026 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1031 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
1032 yaml_event_t *event)
1034 yaml_token_t *token;
1036 token = PEEK_TOKEN(parser);
1037 if (!token) return 0;
1039 if (token->type == YAML_VALUE_TOKEN) {
1041 token = PEEK_TOKEN(parser);
1042 if (!token) return 0;
1043 if (token->type != YAML_FLOW_ENTRY_TOKEN
1044 && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1045 if (!PUSH(parser, parser->states,
1046 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE))
1048 return yaml_parser_parse_node(parser, event, 0, 0);
1051 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE;
1052 return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
1056 * Parse the productions:
1057 * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1062 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
1063 yaml_event_t *event)
1065 yaml_token_t *token;
1067 token = PEEK_TOKEN(parser);
1068 if (!token) return 0;
1070 parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE;
1072 MAPPING_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
1077 * Parse the productions:
1078 * flow_mapping ::= FLOW-MAPPING-START
1079 * ******************
1080 * (flow_mapping_entry FLOW-ENTRY)*
1082 * flow_mapping_entry?
1083 * ******************
1086 * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1091 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
1092 yaml_event_t *event, int first)
1094 yaml_token_t *token;
1097 token = PEEK_TOKEN(parser);
1098 if (!PUSH(parser, parser->marks, token->start_mark))
1103 token = PEEK_TOKEN(parser);
1104 if (!token) return 0;
1106 if (token->type != YAML_FLOW_MAPPING_END_TOKEN)
1109 if (token->type == YAML_FLOW_ENTRY_TOKEN) {
1111 token = PEEK_TOKEN(parser);
1112 if (!token) return 0;
1115 return yaml_parser_set_parser_error_context(parser,
1116 "while parsing a flow mapping", POP(parser, parser->marks),
1117 "did not found expected ',' or '}'", token->start_mark);
1121 if (token->type == YAML_KEY_TOKEN) {
1123 token = PEEK_TOKEN(parser);
1124 if (!token) return 0;
1125 if (token->type != YAML_VALUE_TOKEN
1126 && token->type != YAML_FLOW_ENTRY_TOKEN
1127 && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1128 if (!PUSH(parser, parser->states,
1129 YAML_PARSE_FLOW_MAPPING_VALUE_STATE))
1131 return yaml_parser_parse_node(parser, event, 0, 0);
1134 parser->state = YAML_PARSE_FLOW_MAPPING_VALUE_STATE;
1135 return yaml_parser_process_empty_scalar(parser, event,
1139 else if (token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1140 if (!PUSH(parser, parser->states,
1141 YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE))
1143 return yaml_parser_parse_node(parser, event, 0, 0);
1147 parser->state = POP(parser, parser->states);
1148 POP(parser, parser->marks);
1149 MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
1155 * Parse the productions:
1156 * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1161 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
1162 yaml_event_t *event, int empty)
1164 yaml_token_t *token;
1166 token = PEEK_TOKEN(parser);
1167 if (!token) return 0;
1170 parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1171 return yaml_parser_process_empty_scalar(parser, event,
1175 if (token->type == YAML_VALUE_TOKEN) {
1177 token = PEEK_TOKEN(parser);
1178 if (!token) return 0;
1179 if (token->type != YAML_FLOW_ENTRY_TOKEN
1180 && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1181 if (!PUSH(parser, parser->states,
1182 YAML_PARSE_FLOW_MAPPING_KEY_STATE))
1184 return yaml_parser_parse_node(parser, event, 0, 0);
1188 parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1189 return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
1193 * Generate an empty scalar event.
1197 yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_event_t *event,
1202 value = yaml_malloc(1);
1204 parser->error = YAML_MEMORY_ERROR;
1209 SCALAR_EVENT_INIT(*event, NULL, NULL, value, 0,
1210 1, 0, YAML_PLAIN_SCALAR_STYLE, mark, mark);
1220 yaml_parser_process_directives(yaml_parser_t *parser,
1221 yaml_version_directive_t **version_directive_ref,
1222 yaml_tag_directive_t **tag_directives_start_ref,
1223 yaml_tag_directive_t **tag_directives_end_ref)
1225 yaml_tag_directive_t default_tag_directives[] = {
1226 {(yaml_char_t *)"!", (yaml_char_t *)"!"},
1227 {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
1230 yaml_tag_directive_t *default_tag_directive;
1231 yaml_version_directive_t *version_directive = NULL;
1233 yaml_tag_directive_t *start;
1234 yaml_tag_directive_t *end;
1235 yaml_tag_directive_t *top;
1236 } tag_directives = { NULL, NULL, NULL };
1237 yaml_token_t *token;
1239 if (!STACK_INIT(parser, tag_directives, INITIAL_STACK_SIZE))
1242 token = PEEK_TOKEN(parser);
1243 if (!token) goto error;
1245 while (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
1246 token->type == YAML_TAG_DIRECTIVE_TOKEN)
1248 if (token->type == YAML_VERSION_DIRECTIVE_TOKEN) {
1249 if (version_directive) {
1250 yaml_parser_set_parser_error(parser,
1251 "found duplicate %YAML directive", token->start_mark);
1254 if (token->data.version_directive.major != 1
1255 || token->data.version_directive.minor != 1) {
1256 yaml_parser_set_parser_error(parser,
1257 "found incompatible YAML document", token->start_mark);
1260 version_directive = yaml_malloc(sizeof(yaml_version_directive_t));
1261 if (!version_directive) {
1262 parser->error = YAML_MEMORY_ERROR;
1265 version_directive->major = token->data.version_directive.major;
1266 version_directive->minor = token->data.version_directive.minor;
1269 else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
1270 yaml_tag_directive_t value = {
1271 token->data.tag_directive.handle,
1272 token->data.tag_directive.prefix
1274 if (!yaml_parser_append_tag_directive(parser, value, 0,
1277 if (!PUSH(parser, tag_directives, value))
1282 token = PEEK_TOKEN(parser);
1283 if (!token) goto error;
1286 for (default_tag_directive = default_tag_directives;
1287 default_tag_directive->handle; default_tag_directive++) {
1288 if (!yaml_parser_append_tag_directive(parser, *default_tag_directive, 1,
1293 if (version_directive_ref) {
1294 *version_directive_ref = version_directive;
1296 if (tag_directives_start_ref) {
1297 if (STACK_EMPTY(parser, tag_directives)) {
1298 *tag_directives_start_ref = *tag_directives_end_ref = NULL;
1299 STACK_DEL(parser, tag_directives);
1302 *tag_directives_start_ref = tag_directives.start;
1303 *tag_directives_end_ref = tag_directives.top;
1307 STACK_DEL(parser, tag_directives);
1313 yaml_free(version_directive);
1314 while (!STACK_EMPTY(parser, tag_directives)) {
1315 yaml_tag_directive_t tag_directive = POP(parser, tag_directives);
1316 yaml_free(tag_directive.handle);
1317 yaml_free(tag_directive.prefix);
1319 STACK_DEL(parser, tag_directives);
1324 * Append a tag directive to the directives stack.
1328 yaml_parser_append_tag_directive(yaml_parser_t *parser,
1329 yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark)
1331 yaml_tag_directive_t *tag_directive;
1332 yaml_tag_directive_t copy = { NULL, NULL };
1334 for (tag_directive = parser->tag_directives.start;
1335 tag_directive != parser->tag_directives.top; tag_directive ++) {
1336 if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
1337 if (allow_duplicates)
1339 return yaml_parser_set_parser_error(parser,
1340 "found duplicate %TAG directive", mark);
1344 copy.handle = yaml_strdup(value.handle);
1345 copy.prefix = yaml_strdup(value.prefix);
1346 if (!copy.handle || !copy.prefix) {
1347 parser->error = YAML_MEMORY_ERROR;
1351 if (!PUSH(parser, parser->tag_directives, copy))
1357 yaml_free(copy.handle);
1358 yaml_free(copy.prefix);