parserc.go (34761B)
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 }