Mercurial > yakumo_izuru > aya
comparison vendor/gopkg.in/yaml.v2/parserc.go @ 66:787b5ee0289d draft
Use vendored modules
Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author | yakumo.izuru |
---|---|
date | Sun, 23 Jul 2023 13:18:53 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
65:6d985efa0f7a | 66:787b5ee0289d |
---|---|
1 package yaml | |
2 | |
3 import ( | |
4 "bytes" | |
5 ) | |
6 | |
7 // The parser implements the following grammar: | |
8 // | |
9 // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END | |
10 // implicit_document ::= block_node DOCUMENT-END* | |
11 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* | |
12 // block_node_or_indentless_sequence ::= | |
13 // ALIAS | |
14 // | properties (block_content | indentless_block_sequence)? | |
15 // | block_content | |
16 // | indentless_block_sequence | |
17 // block_node ::= ALIAS | |
18 // | properties block_content? | |
19 // | block_content | |
20 // flow_node ::= ALIAS | |
21 // | properties flow_content? | |
22 // | flow_content | |
23 // properties ::= TAG ANCHOR? | ANCHOR TAG? | |
24 // block_content ::= block_collection | flow_collection | SCALAR | |
25 // flow_content ::= flow_collection | SCALAR | |
26 // block_collection ::= block_sequence | block_mapping | |
27 // flow_collection ::= flow_sequence | flow_mapping | |
28 // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END | |
29 // indentless_sequence ::= (BLOCK-ENTRY block_node?)+ | |
30 // block_mapping ::= BLOCK-MAPPING_START | |
31 // ((KEY block_node_or_indentless_sequence?)? | |
32 // (VALUE block_node_or_indentless_sequence?)?)* | |
33 // BLOCK-END | |
34 // flow_sequence ::= FLOW-SEQUENCE-START | |
35 // (flow_sequence_entry FLOW-ENTRY)* | |
36 // flow_sequence_entry? | |
37 // FLOW-SEQUENCE-END | |
38 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
39 // flow_mapping ::= FLOW-MAPPING-START | |
40 // (flow_mapping_entry FLOW-ENTRY)* | |
41 // flow_mapping_entry? | |
42 // FLOW-MAPPING-END | |
43 // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
44 | |
45 // Peek the next token in the token queue. | |
46 func peek_token(parser *yaml_parser_t) *yaml_token_t { | |
47 if parser.token_available || yaml_parser_fetch_more_tokens(parser) { | |
48 return &parser.tokens[parser.tokens_head] | |
49 } | |
50 return nil | |
51 } | |
52 | |
53 // Remove the next token from the queue (must be called after peek_token). | |
54 func skip_token(parser *yaml_parser_t) { | |
55 parser.token_available = false | |
56 parser.tokens_parsed++ | |
57 parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN | |
58 parser.tokens_head++ | |
59 } | |
60 | |
61 // Get the next event. | |
62 func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { | |
63 // Erase the event object. | |
64 *event = yaml_event_t{} | |
65 | |
66 // No events after the end of the stream or error. | |
67 if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { | |
68 return true | |
69 } | |
70 | |
71 // Generate the next event. | |
72 return yaml_parser_state_machine(parser, event) | |
73 } | |
74 | |
75 // Set parser error. | |
76 func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { | |
77 parser.error = yaml_PARSER_ERROR | |
78 parser.problem = problem | |
79 parser.problem_mark = problem_mark | |
80 return false | |
81 } | |
82 | |
83 func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { | |
84 parser.error = yaml_PARSER_ERROR | |
85 parser.context = context | |
86 parser.context_mark = context_mark | |
87 parser.problem = problem | |
88 parser.problem_mark = problem_mark | |
89 return false | |
90 } | |
91 | |
92 // State dispatcher. | |
93 func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { | |
94 //trace("yaml_parser_state_machine", "state:", parser.state.String()) | |
95 | |
96 switch parser.state { | |
97 case yaml_PARSE_STREAM_START_STATE: | |
98 return yaml_parser_parse_stream_start(parser, event) | |
99 | |
100 case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: | |
101 return yaml_parser_parse_document_start(parser, event, true) | |
102 | |
103 case yaml_PARSE_DOCUMENT_START_STATE: | |
104 return yaml_parser_parse_document_start(parser, event, false) | |
105 | |
106 case yaml_PARSE_DOCUMENT_CONTENT_STATE: | |
107 return yaml_parser_parse_document_content(parser, event) | |
108 | |
109 case yaml_PARSE_DOCUMENT_END_STATE: | |
110 return yaml_parser_parse_document_end(parser, event) | |
111 | |
112 case yaml_PARSE_BLOCK_NODE_STATE: | |
113 return yaml_parser_parse_node(parser, event, true, false) | |
114 | |
115 case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: | |
116 return yaml_parser_parse_node(parser, event, true, true) | |
117 | |
118 case yaml_PARSE_FLOW_NODE_STATE: | |
119 return yaml_parser_parse_node(parser, event, false, false) | |
120 | |
121 case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: | |
122 return yaml_parser_parse_block_sequence_entry(parser, event, true) | |
123 | |
124 case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: | |
125 return yaml_parser_parse_block_sequence_entry(parser, event, false) | |
126 | |
127 case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: | |
128 return yaml_parser_parse_indentless_sequence_entry(parser, event) | |
129 | |
130 case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: | |
131 return yaml_parser_parse_block_mapping_key(parser, event, true) | |
132 | |
133 case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: | |
134 return yaml_parser_parse_block_mapping_key(parser, event, false) | |
135 | |
136 case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: | |
137 return yaml_parser_parse_block_mapping_value(parser, event) | |
138 | |
139 case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: | |
140 return yaml_parser_parse_flow_sequence_entry(parser, event, true) | |
141 | |
142 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: | |
143 return yaml_parser_parse_flow_sequence_entry(parser, event, false) | |
144 | |
145 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: | |
146 return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) | |
147 | |
148 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: | |
149 return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) | |
150 | |
151 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: | |
152 return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) | |
153 | |
154 case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: | |
155 return yaml_parser_parse_flow_mapping_key(parser, event, true) | |
156 | |
157 case yaml_PARSE_FLOW_MAPPING_KEY_STATE: | |
158 return yaml_parser_parse_flow_mapping_key(parser, event, false) | |
159 | |
160 case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: | |
161 return yaml_parser_parse_flow_mapping_value(parser, event, false) | |
162 | |
163 case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: | |
164 return yaml_parser_parse_flow_mapping_value(parser, event, true) | |
165 | |
166 default: | |
167 panic("invalid parser state") | |
168 } | |
169 } | |
170 | |
171 // Parse the production: | |
172 // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END | |
173 // ************ | |
174 func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { | |
175 token := peek_token(parser) | |
176 if token == nil { | |
177 return false | |
178 } | |
179 if token.typ != yaml_STREAM_START_TOKEN { | |
180 return yaml_parser_set_parser_error(parser, "did not find expected <stream-start>", token.start_mark) | |
181 } | |
182 parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE | |
183 *event = yaml_event_t{ | |
184 typ: yaml_STREAM_START_EVENT, | |
185 start_mark: token.start_mark, | |
186 end_mark: token.end_mark, | |
187 encoding: token.encoding, | |
188 } | |
189 skip_token(parser) | |
190 return true | |
191 } | |
192 | |
193 // Parse the productions: | |
194 // implicit_document ::= block_node DOCUMENT-END* | |
195 // * | |
196 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* | |
197 // ************************* | |
198 func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { | |
199 | |
200 token := peek_token(parser) | |
201 if token == nil { | |
202 return false | |
203 } | |
204 | |
205 // Parse extra document end indicators. | |
206 if !implicit { | |
207 for token.typ == yaml_DOCUMENT_END_TOKEN { | |
208 skip_token(parser) | |
209 token = peek_token(parser) | |
210 if token == nil { | |
211 return false | |
212 } | |
213 } | |
214 } | |
215 | |
216 if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && | |
217 token.typ != yaml_TAG_DIRECTIVE_TOKEN && | |
218 token.typ != yaml_DOCUMENT_START_TOKEN && | |
219 token.typ != yaml_STREAM_END_TOKEN { | |
220 // Parse an implicit document. | |
221 if !yaml_parser_process_directives(parser, nil, nil) { | |
222 return false | |
223 } | |
224 parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) | |
225 parser.state = yaml_PARSE_BLOCK_NODE_STATE | |
226 | |
227 *event = yaml_event_t{ | |
228 typ: yaml_DOCUMENT_START_EVENT, | |
229 start_mark: token.start_mark, | |
230 end_mark: token.end_mark, | |
231 } | |
232 | |
233 } else if token.typ != yaml_STREAM_END_TOKEN { | |
234 // Parse an explicit document. | |
235 var version_directive *yaml_version_directive_t | |
236 var tag_directives []yaml_tag_directive_t | |
237 start_mark := token.start_mark | |
238 if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { | |
239 return false | |
240 } | |
241 token = peek_token(parser) | |
242 if token == nil { | |
243 return false | |
244 } | |
245 if token.typ != yaml_DOCUMENT_START_TOKEN { | |
246 yaml_parser_set_parser_error(parser, | |
247 "did not find expected <document start>", token.start_mark) | |
248 return false | |
249 } | |
250 parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) | |
251 parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE | |
252 end_mark := token.end_mark | |
253 | |
254 *event = yaml_event_t{ | |
255 typ: yaml_DOCUMENT_START_EVENT, | |
256 start_mark: start_mark, | |
257 end_mark: end_mark, | |
258 version_directive: version_directive, | |
259 tag_directives: tag_directives, | |
260 implicit: false, | |
261 } | |
262 skip_token(parser) | |
263 | |
264 } else { | |
265 // Parse the stream end. | |
266 parser.state = yaml_PARSE_END_STATE | |
267 *event = yaml_event_t{ | |
268 typ: yaml_STREAM_END_EVENT, | |
269 start_mark: token.start_mark, | |
270 end_mark: token.end_mark, | |
271 } | |
272 skip_token(parser) | |
273 } | |
274 | |
275 return true | |
276 } | |
277 | |
278 // Parse the productions: | |
279 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* | |
280 // *********** | |
281 // | |
282 func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { | |
283 token := peek_token(parser) | |
284 if token == nil { | |
285 return false | |
286 } | |
287 if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || | |
288 token.typ == yaml_TAG_DIRECTIVE_TOKEN || | |
289 token.typ == yaml_DOCUMENT_START_TOKEN || | |
290 token.typ == yaml_DOCUMENT_END_TOKEN || | |
291 token.typ == yaml_STREAM_END_TOKEN { | |
292 parser.state = parser.states[len(parser.states)-1] | |
293 parser.states = parser.states[:len(parser.states)-1] | |
294 return yaml_parser_process_empty_scalar(parser, event, | |
295 token.start_mark) | |
296 } | |
297 return yaml_parser_parse_node(parser, event, true, false) | |
298 } | |
299 | |
300 // Parse the productions: | |
301 // implicit_document ::= block_node DOCUMENT-END* | |
302 // ************* | |
303 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* | |
304 // | |
305 func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { | |
306 token := peek_token(parser) | |
307 if token == nil { | |
308 return false | |
309 } | |
310 | |
311 start_mark := token.start_mark | |
312 end_mark := token.start_mark | |
313 | |
314 implicit := true | |
315 if token.typ == yaml_DOCUMENT_END_TOKEN { | |
316 end_mark = token.end_mark | |
317 skip_token(parser) | |
318 implicit = false | |
319 } | |
320 | |
321 parser.tag_directives = parser.tag_directives[:0] | |
322 | |
323 parser.state = yaml_PARSE_DOCUMENT_START_STATE | |
324 *event = yaml_event_t{ | |
325 typ: yaml_DOCUMENT_END_EVENT, | |
326 start_mark: start_mark, | |
327 end_mark: end_mark, | |
328 implicit: implicit, | |
329 } | |
330 return true | |
331 } | |
332 | |
333 // Parse the productions: | |
334 // block_node_or_indentless_sequence ::= | |
335 // ALIAS | |
336 // ***** | |
337 // | properties (block_content | indentless_block_sequence)? | |
338 // ********** * | |
339 // | block_content | indentless_block_sequence | |
340 // * | |
341 // block_node ::= ALIAS | |
342 // ***** | |
343 // | properties block_content? | |
344 // ********** * | |
345 // | block_content | |
346 // * | |
347 // flow_node ::= ALIAS | |
348 // ***** | |
349 // | properties flow_content? | |
350 // ********** * | |
351 // | flow_content | |
352 // * | |
353 // properties ::= TAG ANCHOR? | ANCHOR TAG? | |
354 // ************************* | |
355 // block_content ::= block_collection | flow_collection | SCALAR | |
356 // ****** | |
357 // flow_content ::= flow_collection | SCALAR | |
358 // ****** | |
359 func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { | |
360 //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() | |
361 | |
362 token := peek_token(parser) | |
363 if token == nil { | |
364 return false | |
365 } | |
366 | |
367 if token.typ == yaml_ALIAS_TOKEN { | |
368 parser.state = parser.states[len(parser.states)-1] | |
369 parser.states = parser.states[:len(parser.states)-1] | |
370 *event = yaml_event_t{ | |
371 typ: yaml_ALIAS_EVENT, | |
372 start_mark: token.start_mark, | |
373 end_mark: token.end_mark, | |
374 anchor: token.value, | |
375 } | |
376 skip_token(parser) | |
377 return true | |
378 } | |
379 | |
380 start_mark := token.start_mark | |
381 end_mark := token.start_mark | |
382 | |
383 var tag_token bool | |
384 var tag_handle, tag_suffix, anchor []byte | |
385 var tag_mark yaml_mark_t | |
386 if token.typ == yaml_ANCHOR_TOKEN { | |
387 anchor = token.value | |
388 start_mark = token.start_mark | |
389 end_mark = token.end_mark | |
390 skip_token(parser) | |
391 token = peek_token(parser) | |
392 if token == nil { | |
393 return false | |
394 } | |
395 if token.typ == yaml_TAG_TOKEN { | |
396 tag_token = true | |
397 tag_handle = token.value | |
398 tag_suffix = token.suffix | |
399 tag_mark = token.start_mark | |
400 end_mark = token.end_mark | |
401 skip_token(parser) | |
402 token = peek_token(parser) | |
403 if token == nil { | |
404 return false | |
405 } | |
406 } | |
407 } else if token.typ == yaml_TAG_TOKEN { | |
408 tag_token = true | |
409 tag_handle = token.value | |
410 tag_suffix = token.suffix | |
411 start_mark = token.start_mark | |
412 tag_mark = token.start_mark | |
413 end_mark = token.end_mark | |
414 skip_token(parser) | |
415 token = peek_token(parser) | |
416 if token == nil { | |
417 return false | |
418 } | |
419 if token.typ == yaml_ANCHOR_TOKEN { | |
420 anchor = token.value | |
421 end_mark = token.end_mark | |
422 skip_token(parser) | |
423 token = peek_token(parser) | |
424 if token == nil { | |
425 return false | |
426 } | |
427 } | |
428 } | |
429 | |
430 var tag []byte | |
431 if tag_token { | |
432 if len(tag_handle) == 0 { | |
433 tag = tag_suffix | |
434 tag_suffix = nil | |
435 } else { | |
436 for i := range parser.tag_directives { | |
437 if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { | |
438 tag = append([]byte(nil), parser.tag_directives[i].prefix...) | |
439 tag = append(tag, tag_suffix...) | |
440 break | |
441 } | |
442 } | |
443 if len(tag) == 0 { | |
444 yaml_parser_set_parser_error_context(parser, | |
445 "while parsing a node", start_mark, | |
446 "found undefined tag handle", tag_mark) | |
447 return false | |
448 } | |
449 } | |
450 } | |
451 | |
452 implicit := len(tag) == 0 | |
453 if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { | |
454 end_mark = token.end_mark | |
455 parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE | |
456 *event = yaml_event_t{ | |
457 typ: yaml_SEQUENCE_START_EVENT, | |
458 start_mark: start_mark, | |
459 end_mark: end_mark, | |
460 anchor: anchor, | |
461 tag: tag, | |
462 implicit: implicit, | |
463 style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), | |
464 } | |
465 return true | |
466 } | |
467 if token.typ == yaml_SCALAR_TOKEN { | |
468 var plain_implicit, quoted_implicit bool | |
469 end_mark = token.end_mark | |
470 if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { | |
471 plain_implicit = true | |
472 } else if len(tag) == 0 { | |
473 quoted_implicit = true | |
474 } | |
475 parser.state = parser.states[len(parser.states)-1] | |
476 parser.states = parser.states[:len(parser.states)-1] | |
477 | |
478 *event = yaml_event_t{ | |
479 typ: yaml_SCALAR_EVENT, | |
480 start_mark: start_mark, | |
481 end_mark: end_mark, | |
482 anchor: anchor, | |
483 tag: tag, | |
484 value: token.value, | |
485 implicit: plain_implicit, | |
486 quoted_implicit: quoted_implicit, | |
487 style: yaml_style_t(token.style), | |
488 } | |
489 skip_token(parser) | |
490 return true | |
491 } | |
492 if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { | |
493 // [Go] Some of the events below can be merged as they differ only on style. | |
494 end_mark = token.end_mark | |
495 parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE | |
496 *event = yaml_event_t{ | |
497 typ: yaml_SEQUENCE_START_EVENT, | |
498 start_mark: start_mark, | |
499 end_mark: end_mark, | |
500 anchor: anchor, | |
501 tag: tag, | |
502 implicit: implicit, | |
503 style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), | |
504 } | |
505 return true | |
506 } | |
507 if token.typ == yaml_FLOW_MAPPING_START_TOKEN { | |
508 end_mark = token.end_mark | |
509 parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE | |
510 *event = yaml_event_t{ | |
511 typ: yaml_MAPPING_START_EVENT, | |
512 start_mark: start_mark, | |
513 end_mark: end_mark, | |
514 anchor: anchor, | |
515 tag: tag, | |
516 implicit: implicit, | |
517 style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), | |
518 } | |
519 return true | |
520 } | |
521 if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { | |
522 end_mark = token.end_mark | |
523 parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE | |
524 *event = yaml_event_t{ | |
525 typ: yaml_SEQUENCE_START_EVENT, | |
526 start_mark: start_mark, | |
527 end_mark: end_mark, | |
528 anchor: anchor, | |
529 tag: tag, | |
530 implicit: implicit, | |
531 style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), | |
532 } | |
533 return true | |
534 } | |
535 if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { | |
536 end_mark = token.end_mark | |
537 parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE | |
538 *event = yaml_event_t{ | |
539 typ: yaml_MAPPING_START_EVENT, | |
540 start_mark: start_mark, | |
541 end_mark: end_mark, | |
542 anchor: anchor, | |
543 tag: tag, | |
544 implicit: implicit, | |
545 style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), | |
546 } | |
547 return true | |
548 } | |
549 if len(anchor) > 0 || len(tag) > 0 { | |
550 parser.state = parser.states[len(parser.states)-1] | |
551 parser.states = parser.states[:len(parser.states)-1] | |
552 | |
553 *event = yaml_event_t{ | |
554 typ: yaml_SCALAR_EVENT, | |
555 start_mark: start_mark, | |
556 end_mark: end_mark, | |
557 anchor: anchor, | |
558 tag: tag, | |
559 implicit: implicit, | |
560 quoted_implicit: false, | |
561 style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), | |
562 } | |
563 return true | |
564 } | |
565 | |
566 context := "while parsing a flow node" | |
567 if block { | |
568 context = "while parsing a block node" | |
569 } | |
570 yaml_parser_set_parser_error_context(parser, context, start_mark, | |
571 "did not find expected node content", token.start_mark) | |
572 return false | |
573 } | |
574 | |
575 // Parse the productions: | |
576 // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END | |
577 // ******************** *********** * ********* | |
578 // | |
579 func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { | |
580 if first { | |
581 token := peek_token(parser) | |
582 parser.marks = append(parser.marks, token.start_mark) | |
583 skip_token(parser) | |
584 } | |
585 | |
586 token := peek_token(parser) | |
587 if token == nil { | |
588 return false | |
589 } | |
590 | |
591 if token.typ == yaml_BLOCK_ENTRY_TOKEN { | |
592 mark := token.end_mark | |
593 skip_token(parser) | |
594 token = peek_token(parser) | |
595 if token == nil { | |
596 return false | |
597 } | |
598 if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { | |
599 parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) | |
600 return yaml_parser_parse_node(parser, event, true, false) | |
601 } else { | |
602 parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE | |
603 return yaml_parser_process_empty_scalar(parser, event, mark) | |
604 } | |
605 } | |
606 if token.typ == yaml_BLOCK_END_TOKEN { | |
607 parser.state = parser.states[len(parser.states)-1] | |
608 parser.states = parser.states[:len(parser.states)-1] | |
609 parser.marks = parser.marks[:len(parser.marks)-1] | |
610 | |
611 *event = yaml_event_t{ | |
612 typ: yaml_SEQUENCE_END_EVENT, | |
613 start_mark: token.start_mark, | |
614 end_mark: token.end_mark, | |
615 } | |
616 | |
617 skip_token(parser) | |
618 return true | |
619 } | |
620 | |
621 context_mark := parser.marks[len(parser.marks)-1] | |
622 parser.marks = parser.marks[:len(parser.marks)-1] | |
623 return yaml_parser_set_parser_error_context(parser, | |
624 "while parsing a block collection", context_mark, | |
625 "did not find expected '-' indicator", token.start_mark) | |
626 } | |
627 | |
628 // Parse the productions: | |
629 // indentless_sequence ::= (BLOCK-ENTRY block_node?)+ | |
630 // *********** * | |
631 func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { | |
632 token := peek_token(parser) | |
633 if token == nil { | |
634 return false | |
635 } | |
636 | |
637 if token.typ == yaml_BLOCK_ENTRY_TOKEN { | |
638 mark := token.end_mark | |
639 skip_token(parser) | |
640 token = peek_token(parser) | |
641 if token == nil { | |
642 return false | |
643 } | |
644 if token.typ != yaml_BLOCK_ENTRY_TOKEN && | |
645 token.typ != yaml_KEY_TOKEN && | |
646 token.typ != yaml_VALUE_TOKEN && | |
647 token.typ != yaml_BLOCK_END_TOKEN { | |
648 parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) | |
649 return yaml_parser_parse_node(parser, event, true, false) | |
650 } | |
651 parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE | |
652 return yaml_parser_process_empty_scalar(parser, event, mark) | |
653 } | |
654 parser.state = parser.states[len(parser.states)-1] | |
655 parser.states = parser.states[:len(parser.states)-1] | |
656 | |
657 *event = yaml_event_t{ | |
658 typ: yaml_SEQUENCE_END_EVENT, | |
659 start_mark: token.start_mark, | |
660 end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? | |
661 } | |
662 return true | |
663 } | |
664 | |
665 // Parse the productions: | |
666 // block_mapping ::= BLOCK-MAPPING_START | |
667 // ******************* | |
668 // ((KEY block_node_or_indentless_sequence?)? | |
669 // *** * | |
670 // (VALUE block_node_or_indentless_sequence?)?)* | |
671 // | |
672 // BLOCK-END | |
673 // ********* | |
674 // | |
675 func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { | |
676 if first { | |
677 token := peek_token(parser) | |
678 parser.marks = append(parser.marks, token.start_mark) | |
679 skip_token(parser) | |
680 } | |
681 | |
682 token := peek_token(parser) | |
683 if token == nil { | |
684 return false | |
685 } | |
686 | |
687 if token.typ == yaml_KEY_TOKEN { | |
688 mark := token.end_mark | |
689 skip_token(parser) | |
690 token = peek_token(parser) | |
691 if token == nil { | |
692 return false | |
693 } | |
694 if token.typ != yaml_KEY_TOKEN && | |
695 token.typ != yaml_VALUE_TOKEN && | |
696 token.typ != yaml_BLOCK_END_TOKEN { | |
697 parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) | |
698 return yaml_parser_parse_node(parser, event, true, true) | |
699 } else { | |
700 parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE | |
701 return yaml_parser_process_empty_scalar(parser, event, mark) | |
702 } | |
703 } else if token.typ == yaml_BLOCK_END_TOKEN { | |
704 parser.state = parser.states[len(parser.states)-1] | |
705 parser.states = parser.states[:len(parser.states)-1] | |
706 parser.marks = parser.marks[:len(parser.marks)-1] | |
707 *event = yaml_event_t{ | |
708 typ: yaml_MAPPING_END_EVENT, | |
709 start_mark: token.start_mark, | |
710 end_mark: token.end_mark, | |
711 } | |
712 skip_token(parser) | |
713 return true | |
714 } | |
715 | |
716 context_mark := parser.marks[len(parser.marks)-1] | |
717 parser.marks = parser.marks[:len(parser.marks)-1] | |
718 return yaml_parser_set_parser_error_context(parser, | |
719 "while parsing a block mapping", context_mark, | |
720 "did not find expected key", token.start_mark) | |
721 } | |
722 | |
723 // Parse the productions: | |
724 // block_mapping ::= BLOCK-MAPPING_START | |
725 // | |
726 // ((KEY block_node_or_indentless_sequence?)? | |
727 // | |
728 // (VALUE block_node_or_indentless_sequence?)?)* | |
729 // ***** * | |
730 // BLOCK-END | |
731 // | |
732 // | |
733 func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { | |
734 token := peek_token(parser) | |
735 if token == nil { | |
736 return false | |
737 } | |
738 if token.typ == yaml_VALUE_TOKEN { | |
739 mark := token.end_mark | |
740 skip_token(parser) | |
741 token = peek_token(parser) | |
742 if token == nil { | |
743 return false | |
744 } | |
745 if token.typ != yaml_KEY_TOKEN && | |
746 token.typ != yaml_VALUE_TOKEN && | |
747 token.typ != yaml_BLOCK_END_TOKEN { | |
748 parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) | |
749 return yaml_parser_parse_node(parser, event, true, true) | |
750 } | |
751 parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE | |
752 return yaml_parser_process_empty_scalar(parser, event, mark) | |
753 } | |
754 parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE | |
755 return yaml_parser_process_empty_scalar(parser, event, token.start_mark) | |
756 } | |
757 | |
758 // Parse the productions: | |
759 // flow_sequence ::= FLOW-SEQUENCE-START | |
760 // ******************* | |
761 // (flow_sequence_entry FLOW-ENTRY)* | |
762 // * ********** | |
763 // flow_sequence_entry? | |
764 // * | |
765 // FLOW-SEQUENCE-END | |
766 // ***************** | |
767 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
768 // * | |
769 // | |
770 func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { | |
771 if first { | |
772 token := peek_token(parser) | |
773 parser.marks = append(parser.marks, token.start_mark) | |
774 skip_token(parser) | |
775 } | |
776 token := peek_token(parser) | |
777 if token == nil { | |
778 return false | |
779 } | |
780 if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { | |
781 if !first { | |
782 if token.typ == yaml_FLOW_ENTRY_TOKEN { | |
783 skip_token(parser) | |
784 token = peek_token(parser) | |
785 if token == nil { | |
786 return false | |
787 } | |
788 } else { | |
789 context_mark := parser.marks[len(parser.marks)-1] | |
790 parser.marks = parser.marks[:len(parser.marks)-1] | |
791 return yaml_parser_set_parser_error_context(parser, | |
792 "while parsing a flow sequence", context_mark, | |
793 "did not find expected ',' or ']'", token.start_mark) | |
794 } | |
795 } | |
796 | |
797 if token.typ == yaml_KEY_TOKEN { | |
798 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE | |
799 *event = yaml_event_t{ | |
800 typ: yaml_MAPPING_START_EVENT, | |
801 start_mark: token.start_mark, | |
802 end_mark: token.end_mark, | |
803 implicit: true, | |
804 style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), | |
805 } | |
806 skip_token(parser) | |
807 return true | |
808 } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { | |
809 parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) | |
810 return yaml_parser_parse_node(parser, event, false, false) | |
811 } | |
812 } | |
813 | |
814 parser.state = parser.states[len(parser.states)-1] | |
815 parser.states = parser.states[:len(parser.states)-1] | |
816 parser.marks = parser.marks[:len(parser.marks)-1] | |
817 | |
818 *event = yaml_event_t{ | |
819 typ: yaml_SEQUENCE_END_EVENT, | |
820 start_mark: token.start_mark, | |
821 end_mark: token.end_mark, | |
822 } | |
823 | |
824 skip_token(parser) | |
825 return true | |
826 } | |
827 | |
828 // | |
829 // Parse the productions: | |
830 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
831 // *** * | |
832 // | |
833 func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { | |
834 token := peek_token(parser) | |
835 if token == nil { | |
836 return false | |
837 } | |
838 if token.typ != yaml_VALUE_TOKEN && | |
839 token.typ != yaml_FLOW_ENTRY_TOKEN && | |
840 token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { | |
841 parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) | |
842 return yaml_parser_parse_node(parser, event, false, false) | |
843 } | |
844 mark := token.end_mark | |
845 skip_token(parser) | |
846 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE | |
847 return yaml_parser_process_empty_scalar(parser, event, mark) | |
848 } | |
849 | |
850 // Parse the productions: | |
851 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
852 // ***** * | |
853 // | |
854 func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { | |
855 token := peek_token(parser) | |
856 if token == nil { | |
857 return false | |
858 } | |
859 if token.typ == yaml_VALUE_TOKEN { | |
860 skip_token(parser) | |
861 token := peek_token(parser) | |
862 if token == nil { | |
863 return false | |
864 } | |
865 if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { | |
866 parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) | |
867 return yaml_parser_parse_node(parser, event, false, false) | |
868 } | |
869 } | |
870 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE | |
871 return yaml_parser_process_empty_scalar(parser, event, token.start_mark) | |
872 } | |
873 | |
874 // Parse the productions: | |
875 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
876 // * | |
877 // | |
878 func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { | |
879 token := peek_token(parser) | |
880 if token == nil { | |
881 return false | |
882 } | |
883 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE | |
884 *event = yaml_event_t{ | |
885 typ: yaml_MAPPING_END_EVENT, | |
886 start_mark: token.start_mark, | |
887 end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? | |
888 } | |
889 return true | |
890 } | |
891 | |
892 // Parse the productions: | |
893 // flow_mapping ::= FLOW-MAPPING-START | |
894 // ****************** | |
895 // (flow_mapping_entry FLOW-ENTRY)* | |
896 // * ********** | |
897 // flow_mapping_entry? | |
898 // ****************** | |
899 // FLOW-MAPPING-END | |
900 // **************** | |
901 // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
902 // * *** * | |
903 // | |
904 func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { | |
905 if first { | |
906 token := peek_token(parser) | |
907 parser.marks = append(parser.marks, token.start_mark) | |
908 skip_token(parser) | |
909 } | |
910 | |
911 token := peek_token(parser) | |
912 if token == nil { | |
913 return false | |
914 } | |
915 | |
916 if token.typ != yaml_FLOW_MAPPING_END_TOKEN { | |
917 if !first { | |
918 if token.typ == yaml_FLOW_ENTRY_TOKEN { | |
919 skip_token(parser) | |
920 token = peek_token(parser) | |
921 if token == nil { | |
922 return false | |
923 } | |
924 } else { | |
925 context_mark := parser.marks[len(parser.marks)-1] | |
926 parser.marks = parser.marks[:len(parser.marks)-1] | |
927 return yaml_parser_set_parser_error_context(parser, | |
928 "while parsing a flow mapping", context_mark, | |
929 "did not find expected ',' or '}'", token.start_mark) | |
930 } | |
931 } | |
932 | |
933 if token.typ == yaml_KEY_TOKEN { | |
934 skip_token(parser) | |
935 token = peek_token(parser) | |
936 if token == nil { | |
937 return false | |
938 } | |
939 if token.typ != yaml_VALUE_TOKEN && | |
940 token.typ != yaml_FLOW_ENTRY_TOKEN && | |
941 token.typ != yaml_FLOW_MAPPING_END_TOKEN { | |
942 parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) | |
943 return yaml_parser_parse_node(parser, event, false, false) | |
944 } else { | |
945 parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE | |
946 return yaml_parser_process_empty_scalar(parser, event, token.start_mark) | |
947 } | |
948 } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { | |
949 parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) | |
950 return yaml_parser_parse_node(parser, event, false, false) | |
951 } | |
952 } | |
953 | |
954 parser.state = parser.states[len(parser.states)-1] | |
955 parser.states = parser.states[:len(parser.states)-1] | |
956 parser.marks = parser.marks[:len(parser.marks)-1] | |
957 *event = yaml_event_t{ | |
958 typ: yaml_MAPPING_END_EVENT, | |
959 start_mark: token.start_mark, | |
960 end_mark: token.end_mark, | |
961 } | |
962 skip_token(parser) | |
963 return true | |
964 } | |
965 | |
966 // Parse the productions: | |
967 // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? | |
968 // * ***** * | |
969 // | |
970 func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { | |
971 token := peek_token(parser) | |
972 if token == nil { | |
973 return false | |
974 } | |
975 if empty { | |
976 parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE | |
977 return yaml_parser_process_empty_scalar(parser, event, token.start_mark) | |
978 } | |
979 if token.typ == yaml_VALUE_TOKEN { | |
980 skip_token(parser) | |
981 token = peek_token(parser) | |
982 if token == nil { | |
983 return false | |
984 } | |
985 if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { | |
986 parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) | |
987 return yaml_parser_parse_node(parser, event, false, false) | |
988 } | |
989 } | |
990 parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE | |
991 return yaml_parser_process_empty_scalar(parser, event, token.start_mark) | |
992 } | |
993 | |
994 // Generate an empty scalar event. | |
995 func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { | |
996 *event = yaml_event_t{ | |
997 typ: yaml_SCALAR_EVENT, | |
998 start_mark: mark, | |
999 end_mark: mark, | |
1000 value: nil, // Empty | |
1001 implicit: true, | |
1002 style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), | |
1003 } | |
1004 return true | |
1005 } | |
1006 | |
1007 var default_tag_directives = []yaml_tag_directive_t{ | |
1008 {[]byte("!"), []byte("!")}, | |
1009 {[]byte("!!"), []byte("tag:yaml.org,2002:")}, | |
1010 } | |
1011 | |
1012 // Parse directives. | |
1013 func yaml_parser_process_directives(parser *yaml_parser_t, | |
1014 version_directive_ref **yaml_version_directive_t, | |
1015 tag_directives_ref *[]yaml_tag_directive_t) bool { | |
1016 | |
1017 var version_directive *yaml_version_directive_t | |
1018 var tag_directives []yaml_tag_directive_t | |
1019 | |
1020 token := peek_token(parser) | |
1021 if token == nil { | |
1022 return false | |
1023 } | |
1024 | |
1025 for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { | |
1026 if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { | |
1027 if version_directive != nil { | |
1028 yaml_parser_set_parser_error(parser, | |
1029 "found duplicate %YAML directive", token.start_mark) | |
1030 return false | |
1031 } | |
1032 if token.major != 1 || token.minor != 1 { | |
1033 yaml_parser_set_parser_error(parser, | |
1034 "found incompatible YAML document", token.start_mark) | |
1035 return false | |
1036 } | |
1037 version_directive = &yaml_version_directive_t{ | |
1038 major: token.major, | |
1039 minor: token.minor, | |
1040 } | |
1041 } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { | |
1042 value := yaml_tag_directive_t{ | |
1043 handle: token.value, | |
1044 prefix: token.prefix, | |
1045 } | |
1046 if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { | |
1047 return false | |
1048 } | |
1049 tag_directives = append(tag_directives, value) | |
1050 } | |
1051 | |
1052 skip_token(parser) | |
1053 token = peek_token(parser) | |
1054 if token == nil { | |
1055 return false | |
1056 } | |
1057 } | |
1058 | |
1059 for i := range default_tag_directives { | |
1060 if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { | |
1061 return false | |
1062 } | |
1063 } | |
1064 | |
1065 if version_directive_ref != nil { | |
1066 *version_directive_ref = version_directive | |
1067 } | |
1068 if tag_directives_ref != nil { | |
1069 *tag_directives_ref = tag_directives | |
1070 } | |
1071 return true | |
1072 } | |
1073 | |
1074 // Append a tag directive to the directives stack. | |
1075 func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { | |
1076 for i := range parser.tag_directives { | |
1077 if bytes.Equal(value.handle, parser.tag_directives[i].handle) { | |
1078 if allow_duplicates { | |
1079 return true | |
1080 } | |
1081 return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) | |
1082 } | |
1083 } | |
1084 | |
1085 // [Go] I suspect the copy is unnecessary. This was likely done | |
1086 // because there was no way to track ownership of the data. | |
1087 value_copy := yaml_tag_directive_t{ | |
1088 handle: make([]byte, len(value.handle)), | |
1089 prefix: make([]byte, len(value.prefix)), | |
1090 } | |
1091 copy(value_copy.handle, value.handle) | |
1092 copy(value_copy.prefix, value.prefix) | |
1093 parser.tag_directives = append(parser.tag_directives, value_copy) | |
1094 return true | |
1095 } |