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_state_machine(yaml_parser_t *parser);
68 yaml_parser_parse_stream_start(yaml_parser_t *parser);
71 yaml_parser_parse_document_start(yaml_parser_t *parser, int implicit);
74 yaml_parser_parse_document_content(yaml_parser_t *parser);
77 yaml_parser_parse_document_end(yaml_parser_t *parser);
80 yaml_parser_parse_node(yaml_parser_t *parser,
81 int block, int indentless_sequence);
84 yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser, int first);
87 yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser);
90 yaml_parser_parse_block_mapping_key(yaml_parser_t *parser, int first);
93 yaml_parser_parse_block_mapping_value(yaml_parser_t *parser);
96 yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser, int first);
99 yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser);
101 static yaml_event_t *
102 yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser);
104 static yaml_event_t *
105 yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser);
107 static yaml_event_t *
108 yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser, int first);
110 static yaml_event_t *
111 yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser, int empty);
114 * Get the next event and advance the parser.
117 YAML_DECLARE(yaml_event_t *)
118 yaml_parser_get_event(yaml_parser_t *parser)
122 /* Update the current event if needed. */
124 if (!parser->current_event) {
125 parser->current_event = yaml_parser_state_machine(parser);
128 /* Return and clear the current event. */
130 value = parser->current_event;
131 parser->current_event = NULL;
136 * Peek the next event.
139 YAML_DECLARE(yaml_event_t *)
140 yaml_parser_peek_event(yaml_parser_t *parser)
144 /* Update the current event if needed. */
146 if (!parser->current_event) {
147 parser->current_event = yaml_parser_state_machine(parser);
150 /* Return the current event. */
152 return parser->current_event;
159 static yaml_event_t *
160 yaml_parser_state_machine(yaml_parser_t *parser)
162 assert (parser->state != YAML_PARSE_END_STATE);
164 switch (parser->state)
166 case YAML_PARSE_STREAM_START_STATE:
167 return yaml_parser_parse_stream_start(parser);
169 case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
170 return yaml_parser_parse_document_start(parser, 1);
172 case YAML_PARSE_DOCUMENT_START_STATE:
173 return yaml_parser_parse_document_start(parser, 0);
175 case YAML_PARSE_DOCUMENT_CONTENT_STATE:
176 return yaml_parser_parse_document_content(parser);
178 case YAML_PARSE_DOCUMENT_END_STATE:
179 return yaml_parser_parse_document_end(parser);
181 case YAML_PARSE_BLOCK_NODE_STATE:
182 return yaml_parser_parse_node(parser, 1, 0);
184 case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
185 return yaml_parser_parse_node(parser, 1, 1);
187 case YAML_PARSE_FLOW_NODE_STATE:
188 return yaml_parser_parse_node(parser, 0, 0);
190 case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
191 return yaml_parser_parse_block_sequence_entry(parser, 1);
193 case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
194 return yaml_parser_parse_block_sequence_entry(parser, 0);
196 case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
197 return yaml_parser_parse_indentless_sequence_entry(parser);
199 case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
200 return yaml_parser_parse_block_mapping_key(parser, 1);
202 case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
203 return yaml_parser_parse_block_mapping_key(parser, 0);
205 case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
206 return yaml_parser_parse_block_mapping_value(parser);
208 case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
209 return yaml_parser_parse_flow_sequence_entry(parser, 1);
211 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
212 return yaml_parser_parse_flow_sequence_entry(parser, 0);
214 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
215 return yaml_parser_parse_flow_sequence_entry_mapping_key(parser);
217 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
218 return yaml_parser_parse_flow_sequence_entry_mapping_value(parser);
220 case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
221 return yaml_parser_parse_flow_sequence_entry_mapping_end(parser);
223 case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
224 return yaml_parser_parse_flow_mapping_key(parser, 1);
226 case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
227 return yaml_parser_parse_flow_mapping_key(parser, 0);
229 case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
230 return yaml_parser_parse_flow_mapping_value(parser, 0);
232 case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
233 return yaml_parser_parse_flow_mapping_value(parser, 1);