66
|
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 }
|