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