github.com/go-xe2/third@v1.0.3/gopkg.in/yaml.v2/parserc.go (about)

     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  }