annotate vendor/gopkg.in/yaml.v3/parserc.go @ 74:d8727551f403 draft

The Empress (III) * Change the way how versions are handled in version.go (to ease `go install`) * Upgrade yaml.v2 to yaml.v3 Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Mon, 04 Dec 2023 00:54:29 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
74
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2 // Copyright (c) 2011-2019 Canonical Ltd
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3 // Copyright (c) 2006-2010 Kirill Simonov
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
4 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
5 // Permission is hereby granted, free of charge, to any person obtaining a copy of
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
6 // this software and associated documentation files (the "Software"), to deal in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
7 // the Software without restriction, including without limitation the rights to
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
8 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
9 // of the Software, and to permit persons to whom the Software is furnished to do
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
10 // so, subject to the following conditions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
11 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
12 // The above copyright notice and this permission notice shall be included in all
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
13 // copies or substantial portions of the Software.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
14 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
21 // SOFTWARE.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
22
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
23 package yaml
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
24
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
25 import (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
26 "bytes"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
27 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
28
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
29 // The parser implements the following grammar:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
30 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
31 // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
32 // implicit_document ::= block_node DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
33 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
34 // block_node_or_indentless_sequence ::=
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
35 // ALIAS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
36 // | properties (block_content | indentless_block_sequence)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
37 // | block_content
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
38 // | indentless_block_sequence
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
39 // block_node ::= ALIAS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
40 // | properties block_content?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
41 // | block_content
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
42 // flow_node ::= ALIAS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
43 // | properties flow_content?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
44 // | flow_content
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
45 // properties ::= TAG ANCHOR? | ANCHOR TAG?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
46 // block_content ::= block_collection | flow_collection | SCALAR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
47 // flow_content ::= flow_collection | SCALAR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
48 // block_collection ::= block_sequence | block_mapping
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
49 // flow_collection ::= flow_sequence | flow_mapping
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
50 // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
51 // indentless_sequence ::= (BLOCK-ENTRY block_node?)+
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
52 // block_mapping ::= BLOCK-MAPPING_START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
53 // ((KEY block_node_or_indentless_sequence?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
54 // (VALUE block_node_or_indentless_sequence?)?)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
55 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
56 // flow_sequence ::= FLOW-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
57 // (flow_sequence_entry FLOW-ENTRY)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
58 // flow_sequence_entry?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
59 // FLOW-SEQUENCE-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
60 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
61 // flow_mapping ::= FLOW-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
62 // (flow_mapping_entry FLOW-ENTRY)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
63 // flow_mapping_entry?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
64 // FLOW-MAPPING-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
65 // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
66
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
67 // Peek the next token in the token queue.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
68 func peek_token(parser *yaml_parser_t) *yaml_token_t {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
69 if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
70 token := &parser.tokens[parser.tokens_head]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
71 yaml_parser_unfold_comments(parser, token)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
72 return token
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
73 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
74 return nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
75 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
76
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
77 // yaml_parser_unfold_comments walks through the comments queue and joins all
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
78 // comments behind the position of the provided token into the respective
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
79 // top-level comment slices in the parser.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
80 func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
81 for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
82 comment := &parser.comments[parser.comments_head]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
83 if len(comment.head) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
84 if token.typ == yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
85 // No heads on ends, so keep comment.head for a follow up token.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
86 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
87 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
88 if len(parser.head_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
89 parser.head_comment = append(parser.head_comment, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
90 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
91 parser.head_comment = append(parser.head_comment, comment.head...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
92 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
93 if len(comment.foot) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
94 if len(parser.foot_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
95 parser.foot_comment = append(parser.foot_comment, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
96 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
97 parser.foot_comment = append(parser.foot_comment, comment.foot...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
98 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
99 if len(comment.line) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
100 if len(parser.line_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
101 parser.line_comment = append(parser.line_comment, '\n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
102 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
103 parser.line_comment = append(parser.line_comment, comment.line...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
104 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
105 *comment = yaml_comment_t{}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
106 parser.comments_head++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
107 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
108 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
109
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
110 // Remove the next token from the queue (must be called after peek_token).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
111 func skip_token(parser *yaml_parser_t) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
112 parser.token_available = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
113 parser.tokens_parsed++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
114 parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
115 parser.tokens_head++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
116 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
117
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
118 // Get the next event.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
119 func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
120 // Erase the event object.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
121 *event = yaml_event_t{}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
122
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
123 // No events after the end of the stream or error.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
124 if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
125 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
126 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
127
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
128 // Generate the next event.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
129 return yaml_parser_state_machine(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
130 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
131
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
132 // Set parser error.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
133 func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
134 parser.error = yaml_PARSER_ERROR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
135 parser.problem = problem
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
136 parser.problem_mark = problem_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
137 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
138 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
139
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
140 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 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
141 parser.error = yaml_PARSER_ERROR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
142 parser.context = context
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
143 parser.context_mark = context_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
144 parser.problem = problem
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
145 parser.problem_mark = problem_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
146 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
147 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
148
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
149 // State dispatcher.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
150 func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
151 //trace("yaml_parser_state_machine", "state:", parser.state.String())
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
152
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
153 switch parser.state {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
154 case yaml_PARSE_STREAM_START_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
155 return yaml_parser_parse_stream_start(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
156
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
157 case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
158 return yaml_parser_parse_document_start(parser, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
159
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
160 case yaml_PARSE_DOCUMENT_START_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
161 return yaml_parser_parse_document_start(parser, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
162
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
163 case yaml_PARSE_DOCUMENT_CONTENT_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
164 return yaml_parser_parse_document_content(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
165
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
166 case yaml_PARSE_DOCUMENT_END_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
167 return yaml_parser_parse_document_end(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
168
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
169 case yaml_PARSE_BLOCK_NODE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
170 return yaml_parser_parse_node(parser, event, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
171
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
172 case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
173 return yaml_parser_parse_node(parser, event, true, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
174
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
175 case yaml_PARSE_FLOW_NODE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
176 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
177
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
178 case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
179 return yaml_parser_parse_block_sequence_entry(parser, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
180
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
181 case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
182 return yaml_parser_parse_block_sequence_entry(parser, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
183
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
184 case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
185 return yaml_parser_parse_indentless_sequence_entry(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
186
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
187 case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
188 return yaml_parser_parse_block_mapping_key(parser, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
189
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
190 case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
191 return yaml_parser_parse_block_mapping_key(parser, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
192
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
193 case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
194 return yaml_parser_parse_block_mapping_value(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
195
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
196 case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
197 return yaml_parser_parse_flow_sequence_entry(parser, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
198
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
199 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
200 return yaml_parser_parse_flow_sequence_entry(parser, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
201
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
202 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
203 return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
204
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
205 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
206 return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
207
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
208 case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
209 return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
210
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
211 case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
212 return yaml_parser_parse_flow_mapping_key(parser, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
213
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
214 case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
215 return yaml_parser_parse_flow_mapping_key(parser, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
216
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
217 case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
218 return yaml_parser_parse_flow_mapping_value(parser, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
219
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
220 case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
221 return yaml_parser_parse_flow_mapping_value(parser, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
222
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
223 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
224 panic("invalid parser state")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
225 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
226 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
227
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
228 // Parse the production:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
229 // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
230 // ************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
231 func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
232 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
233 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
234 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
235 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
236 if token.typ != yaml_STREAM_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
237 return yaml_parser_set_parser_error(parser, "did not find expected <stream-start>", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
238 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
239 parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
240 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
241 typ: yaml_STREAM_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
242 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
243 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
244 encoding: token.encoding,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
245 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
246 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
247 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
248 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
249
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
250 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
251 // implicit_document ::= block_node DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
252 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
253 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
254 // *************************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
255 func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
256
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
257 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
258 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
259 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
260 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
261
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
262 // Parse extra document end indicators.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
263 if !implicit {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
264 for token.typ == yaml_DOCUMENT_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
265 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
266 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
267 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
268 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
269 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
270 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
271 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
272
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
273 if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
274 token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
275 token.typ != yaml_DOCUMENT_START_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
276 token.typ != yaml_STREAM_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
277 // Parse an implicit document.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
278 if !yaml_parser_process_directives(parser, nil, nil) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
279 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
280 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
281 parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
282 parser.state = yaml_PARSE_BLOCK_NODE_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
283
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
284 var head_comment []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
285 if len(parser.head_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
286 // [Go] Scan the header comment backwards, and if an empty line is found, break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
287 // the header so the part before the last empty line goes into the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
288 // document header, while the bottom of it goes into a follow up event.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
289 for i := len(parser.head_comment) - 1; i > 0; i-- {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
290 if parser.head_comment[i] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
291 if i == len(parser.head_comment)-1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
292 head_comment = parser.head_comment[:i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
293 parser.head_comment = parser.head_comment[i+1:]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
294 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
295 } else if parser.head_comment[i-1] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
296 head_comment = parser.head_comment[:i-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
297 parser.head_comment = parser.head_comment[i+1:]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
298 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
299 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
300 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
301 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
302 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
303
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
304 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
305 typ: yaml_DOCUMENT_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
306 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
307 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
308
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
309 head_comment: head_comment,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
310 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
311
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
312 } else if token.typ != yaml_STREAM_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
313 // Parse an explicit document.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
314 var version_directive *yaml_version_directive_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
315 var tag_directives []yaml_tag_directive_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
316 start_mark := token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
317 if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
318 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
319 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
320 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
321 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
322 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
323 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
324 if token.typ != yaml_DOCUMENT_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
325 yaml_parser_set_parser_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
326 "did not find expected <document start>", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
327 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
328 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
329 parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
330 parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
331 end_mark := token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
332
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
333 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
334 typ: yaml_DOCUMENT_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
335 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
336 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
337 version_directive: version_directive,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
338 tag_directives: tag_directives,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
339 implicit: false,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
340 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
341 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
342
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
343 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
344 // Parse the stream end.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
345 parser.state = yaml_PARSE_END_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
346 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
347 typ: yaml_STREAM_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
348 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
349 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
350 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
351 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
352 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
353
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
354 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
355 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
356
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
357 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
358 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
359 // ***********
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
360 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
361 func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
362 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
363 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
364 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
365 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
366
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
367 if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
368 token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
369 token.typ == yaml_DOCUMENT_START_TOKEN ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
370 token.typ == yaml_DOCUMENT_END_TOKEN ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
371 token.typ == yaml_STREAM_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
372 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
373 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
374 return yaml_parser_process_empty_scalar(parser, event,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
375 token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
376 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
377 return yaml_parser_parse_node(parser, event, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
378 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
379
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
380 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
381 // implicit_document ::= block_node DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
382 // *************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
383 // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
384 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
385 func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
386 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
387 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
388 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
389 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
390
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
391 start_mark := token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
392 end_mark := token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
393
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
394 implicit := true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
395 if token.typ == yaml_DOCUMENT_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
396 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
397 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
398 implicit = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
399 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
400
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
401 parser.tag_directives = parser.tag_directives[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
402
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
403 parser.state = yaml_PARSE_DOCUMENT_START_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
404 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
405 typ: yaml_DOCUMENT_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
406 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
407 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
408 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
409 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
410 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
411 if len(event.head_comment) > 0 && len(event.foot_comment) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
412 event.foot_comment = event.head_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
413 event.head_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
414 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
415 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
416 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
417
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
418 func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
419 event.head_comment = parser.head_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
420 event.line_comment = parser.line_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
421 event.foot_comment = parser.foot_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
422 parser.head_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
423 parser.line_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
424 parser.foot_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
425 parser.tail_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
426 parser.stem_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
427 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
428
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
429 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
430 // block_node_or_indentless_sequence ::=
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
431 // ALIAS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
432 // *****
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
433 // | properties (block_content | indentless_block_sequence)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
434 // ********** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
435 // | block_content | indentless_block_sequence
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
436 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
437 // block_node ::= ALIAS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
438 // *****
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
439 // | properties block_content?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
440 // ********** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
441 // | block_content
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
442 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
443 // flow_node ::= ALIAS
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
444 // *****
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
445 // | properties flow_content?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
446 // ********** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
447 // | flow_content
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
448 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
449 // properties ::= TAG ANCHOR? | ANCHOR TAG?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
450 // *************************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
451 // block_content ::= block_collection | flow_collection | SCALAR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
452 // ******
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
453 // flow_content ::= flow_collection | SCALAR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
454 // ******
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
455 func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
456 //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
457
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
458 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
459 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
460 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
461 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
462
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
463 if token.typ == yaml_ALIAS_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
464 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
465 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
466 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
467 typ: yaml_ALIAS_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
468 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
469 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
470 anchor: token.value,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
471 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
472 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
473 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
474 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
475 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
476
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
477 start_mark := token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
478 end_mark := token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
479
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
480 var tag_token bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
481 var tag_handle, tag_suffix, anchor []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
482 var tag_mark yaml_mark_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
483 if token.typ == yaml_ANCHOR_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
484 anchor = token.value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
485 start_mark = token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
486 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
487 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
488 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
489 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
490 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
491 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
492 if token.typ == yaml_TAG_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
493 tag_token = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
494 tag_handle = token.value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
495 tag_suffix = token.suffix
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
496 tag_mark = token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
497 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
498 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
499 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
500 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
501 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
502 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
503 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
504 } else if token.typ == yaml_TAG_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
505 tag_token = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
506 tag_handle = token.value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
507 tag_suffix = token.suffix
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
508 start_mark = token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
509 tag_mark = token.start_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
510 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
511 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
512 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
513 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
514 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
515 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
516 if token.typ == yaml_ANCHOR_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
517 anchor = token.value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
518 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
519 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
520 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
521 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
522 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
523 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
524 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
525 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
526
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
527 var tag []byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
528 if tag_token {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
529 if len(tag_handle) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
530 tag = tag_suffix
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
531 tag_suffix = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
532 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
533 for i := range parser.tag_directives {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
534 if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
535 tag = append([]byte(nil), parser.tag_directives[i].prefix...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
536 tag = append(tag, tag_suffix...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
537 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
538 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
539 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
540 if len(tag) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
541 yaml_parser_set_parser_error_context(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
542 "while parsing a node", start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
543 "found undefined tag handle", tag_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
544 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
545 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
546 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
547 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
548
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
549 implicit := len(tag) == 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
550 if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
551 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
552 parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
553 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
554 typ: yaml_SEQUENCE_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
555 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
556 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
557 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
558 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
559 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
560 style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
561 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
562 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
563 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
564 if token.typ == yaml_SCALAR_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
565 var plain_implicit, quoted_implicit bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
566 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
567 if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
568 plain_implicit = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
569 } else if len(tag) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
570 quoted_implicit = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
571 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
572 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
573 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
574
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
575 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
576 typ: yaml_SCALAR_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
577 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
578 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
579 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
580 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
581 value: token.value,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
582 implicit: plain_implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
583 quoted_implicit: quoted_implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
584 style: yaml_style_t(token.style),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
585 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
586 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
587 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
588 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
589 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
590 if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
591 // [Go] Some of the events below can be merged as they differ only on style.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
592 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
593 parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
594 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
595 typ: yaml_SEQUENCE_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
596 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
597 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
598 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
599 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
600 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
601 style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
602 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
603 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
604 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
605 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
606 if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
607 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
608 parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
609 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
610 typ: yaml_MAPPING_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
611 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
612 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
613 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
614 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
615 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
616 style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
617 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
618 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
619 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
620 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
621 if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
622 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
623 parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
624 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
625 typ: yaml_SEQUENCE_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
626 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
627 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
628 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
629 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
630 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
631 style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
632 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
633 if parser.stem_comment != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
634 event.head_comment = parser.stem_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
635 parser.stem_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
636 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
637 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
638 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
639 if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
640 end_mark = token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
641 parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
642 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
643 typ: yaml_MAPPING_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
644 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
645 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
646 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
647 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
648 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
649 style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
650 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
651 if parser.stem_comment != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
652 event.head_comment = parser.stem_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
653 parser.stem_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
654 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
655 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
656 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
657 if len(anchor) > 0 || len(tag) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
658 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
659 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
660
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
661 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
662 typ: yaml_SCALAR_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
663 start_mark: start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
664 end_mark: end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
665 anchor: anchor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
666 tag: tag,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
667 implicit: implicit,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
668 quoted_implicit: false,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
669 style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
670 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
671 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
672 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
673
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
674 context := "while parsing a flow node"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
675 if block {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
676 context = "while parsing a block node"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
677 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
678 yaml_parser_set_parser_error_context(parser, context, start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
679 "did not find expected node content", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
680 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
681 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
682
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
683 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
684 // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
685 // ******************** *********** * *********
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
686 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
687 func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
688 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
689 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
690 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
691 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
692 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
693 parser.marks = append(parser.marks, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
694 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
695 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
696
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
697 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
698 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
699 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
700 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
701
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
702 if token.typ == yaml_BLOCK_ENTRY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
703 mark := token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
704 prior_head_len := len(parser.head_comment)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
705 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
706 yaml_parser_split_stem_comment(parser, prior_head_len)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
707 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
708 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
709 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
710 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
711 if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
712 parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
713 return yaml_parser_parse_node(parser, event, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
714 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
715 parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
716 return yaml_parser_process_empty_scalar(parser, event, mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
717 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
718 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
719 if token.typ == yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
720 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
721 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
722 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
723
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
724 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
725 typ: yaml_SEQUENCE_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
726 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
727 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
728 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
729
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
730 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
731 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
732 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
733
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
734 context_mark := parser.marks[len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
735 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
736 return yaml_parser_set_parser_error_context(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
737 "while parsing a block collection", context_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
738 "did not find expected '-' indicator", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
739 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
740
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
741 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
742 // indentless_sequence ::= (BLOCK-ENTRY block_node?)+
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
743 // *********** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
744 func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
745 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
746 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
747 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
748 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
749
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
750 if token.typ == yaml_BLOCK_ENTRY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
751 mark := token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
752 prior_head_len := len(parser.head_comment)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
753 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
754 yaml_parser_split_stem_comment(parser, prior_head_len)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
755 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
756 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
757 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
758 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
759 if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
760 token.typ != yaml_KEY_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
761 token.typ != yaml_VALUE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
762 token.typ != yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
763 parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
764 return yaml_parser_parse_node(parser, event, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
765 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
766 parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
767 return yaml_parser_process_empty_scalar(parser, event, mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
768 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
769 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
770 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
771
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
772 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
773 typ: yaml_SEQUENCE_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
774 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
775 end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
776 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
777 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
778 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
779
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
780 // Split stem comment from head comment.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
781 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
782 // When a sequence or map is found under a sequence entry, the former head comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
783 // is assigned to the underlying sequence or map as a whole, not the individual
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
784 // sequence or map entry as would be expected otherwise. To handle this case the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
785 // previous head comment is moved aside as the stem comment.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
786 func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
787 if stem_len == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
788 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
789 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
790
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
791 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
792 if token == nil || token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
793 return
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
794 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
795
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
796 parser.stem_comment = parser.head_comment[:stem_len]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
797 if len(parser.head_comment) == stem_len {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
798 parser.head_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
799 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
800 // Copy suffix to prevent very strange bugs if someone ever appends
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
801 // further bytes to the prefix in the stem_comment slice above.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
802 parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
803 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
804 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
805
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
806 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
807 // block_mapping ::= BLOCK-MAPPING_START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
808 // *******************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
809 // ((KEY block_node_or_indentless_sequence?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
810 // *** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
811 // (VALUE block_node_or_indentless_sequence?)?)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
812 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
813 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
814 // *********
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
815 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
816 func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
817 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
818 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
819 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
820 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
821 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
822 parser.marks = append(parser.marks, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
823 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
824 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
825
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
826 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
827 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
828 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
829 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
830
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
831 // [Go] A tail comment was left from the prior mapping value processed. Emit an event
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
832 // as it needs to be processed with that value and not the following key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
833 if len(parser.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
834 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
835 typ: yaml_TAIL_COMMENT_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
836 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
837 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
838 foot_comment: parser.tail_comment,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
839 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
840 parser.tail_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
841 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
842 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
843
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
844 if token.typ == yaml_KEY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
845 mark := token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
846 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
847 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
848 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
849 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
850 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
851 if token.typ != yaml_KEY_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
852 token.typ != yaml_VALUE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
853 token.typ != yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
854 parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
855 return yaml_parser_parse_node(parser, event, true, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
856 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
857 parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
858 return yaml_parser_process_empty_scalar(parser, event, mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
859 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
860 } else if token.typ == yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
861 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
862 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
863 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
864 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
865 typ: yaml_MAPPING_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
866 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
867 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
868 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
869 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
870 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
871 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
872 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
873
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
874 context_mark := parser.marks[len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
875 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
876 return yaml_parser_set_parser_error_context(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
877 "while parsing a block mapping", context_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
878 "did not find expected key", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
879 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
880
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
881 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
882 // block_mapping ::= BLOCK-MAPPING_START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
883 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
884 // ((KEY block_node_or_indentless_sequence?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
885 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
886 // (VALUE block_node_or_indentless_sequence?)?)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
887 // ***** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
888 // BLOCK-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
889 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
890 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
891 func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
892 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
893 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
894 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
895 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
896 if token.typ == yaml_VALUE_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
897 mark := token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
898 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
899 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
900 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
901 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
902 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
903 if token.typ != yaml_KEY_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
904 token.typ != yaml_VALUE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
905 token.typ != yaml_BLOCK_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
906 parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
907 return yaml_parser_parse_node(parser, event, true, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
908 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
909 parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
910 return yaml_parser_process_empty_scalar(parser, event, mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
911 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
912 parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
913 return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
914 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
915
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
916 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
917 // flow_sequence ::= FLOW-SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
918 // *******************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
919 // (flow_sequence_entry FLOW-ENTRY)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
920 // * **********
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
921 // flow_sequence_entry?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
922 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
923 // FLOW-SEQUENCE-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
924 // *****************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
925 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
926 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
927 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
928 func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
929 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
930 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
931 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
932 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
933 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
934 parser.marks = append(parser.marks, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
935 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
936 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
937 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
938 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
939 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
940 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
941 if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
942 if !first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
943 if token.typ == yaml_FLOW_ENTRY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
944 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
945 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
946 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
947 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
948 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
949 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
950 context_mark := parser.marks[len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
951 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
952 return yaml_parser_set_parser_error_context(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
953 "while parsing a flow sequence", context_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
954 "did not find expected ',' or ']'", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
955 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
956 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
957
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
958 if token.typ == yaml_KEY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
959 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
960 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
961 typ: yaml_MAPPING_START_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
962 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
963 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
964 implicit: true,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
965 style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
966 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
967 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
968 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
969 } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
970 parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
971 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
972 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
973 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
974
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
975 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
976 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
977 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
978
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
979 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
980 typ: yaml_SEQUENCE_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
981 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
982 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
983 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
984 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
985
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
986 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
987 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
988 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
989
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
990 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
991 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
992 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
993 // *** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
994 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
995 func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
996 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
997 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
998 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
999 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1000 if token.typ != yaml_VALUE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1001 token.typ != yaml_FLOW_ENTRY_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1002 token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1003 parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1004 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1005 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1006 mark := token.end_mark
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1007 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1008 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1009 return yaml_parser_process_empty_scalar(parser, event, mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1010 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1011
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1012 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1013 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1014 // ***** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1015 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1016 func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1017 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1018 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1019 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1020 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1021 if token.typ == yaml_VALUE_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1022 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1023 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1024 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1025 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1026 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1027 if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1028 parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1029 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1030 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1031 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1032 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1033 return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1034 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1035
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1036 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1037 // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1038 // *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1039 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1040 func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1041 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1042 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1043 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1044 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1045 parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1046 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1047 typ: yaml_MAPPING_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1048 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1049 end_mark: token.start_mark, // [Go] Shouldn't this be end_mark?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1050 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1051 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1052 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1053
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1054 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1055 // flow_mapping ::= FLOW-MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1056 // ******************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1057 // (flow_mapping_entry FLOW-ENTRY)*
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1058 // * **********
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1059 // flow_mapping_entry?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1060 // ******************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1061 // FLOW-MAPPING-END
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1062 // ****************
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1063 // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1064 // * *** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1065 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1066 func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1067 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1068 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1069 parser.marks = append(parser.marks, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1070 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1071 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1072
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1073 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1074 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1075 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1076 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1077
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1078 if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1079 if !first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1080 if token.typ == yaml_FLOW_ENTRY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1081 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1082 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1083 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1084 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1085 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1086 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1087 context_mark := parser.marks[len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1088 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1089 return yaml_parser_set_parser_error_context(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1090 "while parsing a flow mapping", context_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1091 "did not find expected ',' or '}'", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1092 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1093 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1094
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1095 if token.typ == yaml_KEY_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1096 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1097 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1098 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1099 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1100 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1101 if token.typ != yaml_VALUE_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1102 token.typ != yaml_FLOW_ENTRY_TOKEN &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1103 token.typ != yaml_FLOW_MAPPING_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1104 parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1105 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1106 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1107 parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1108 return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1109 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1110 } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1111 parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1112 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1113 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1114 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1115
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1116 parser.state = parser.states[len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1117 parser.states = parser.states[:len(parser.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1118 parser.marks = parser.marks[:len(parser.marks)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1119 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1120 typ: yaml_MAPPING_END_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1121 start_mark: token.start_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1122 end_mark: token.end_mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1123 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1124 yaml_parser_set_event_comments(parser, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1125 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1126 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1127 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1128
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1129 // Parse the productions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1130 // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1131 // * ***** *
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1132 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1133 func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1134 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1135 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1136 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1137 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1138 if empty {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1139 parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1140 return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1141 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1142 if token.typ == yaml_VALUE_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1143 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1144 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1145 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1146 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1147 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1148 if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1149 parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1150 return yaml_parser_parse_node(parser, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1151 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1152 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1153 parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1154 return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1155 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1156
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1157 // Generate an empty scalar event.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1158 func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1159 *event = yaml_event_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1160 typ: yaml_SCALAR_EVENT,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1161 start_mark: mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1162 end_mark: mark,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1163 value: nil, // Empty
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1164 implicit: true,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1165 style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1166 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1167 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1168 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1169
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1170 var default_tag_directives = []yaml_tag_directive_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1171 {[]byte("!"), []byte("!")},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1172 {[]byte("!!"), []byte("tag:yaml.org,2002:")},
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1173 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1174
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1175 // Parse directives.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1176 func yaml_parser_process_directives(parser *yaml_parser_t,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1177 version_directive_ref **yaml_version_directive_t,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1178 tag_directives_ref *[]yaml_tag_directive_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1179
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1180 var version_directive *yaml_version_directive_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1181 var tag_directives []yaml_tag_directive_t
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1182
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1183 token := peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1184 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1185 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1186 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1187
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1188 for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1189 if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1190 if version_directive != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1191 yaml_parser_set_parser_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1192 "found duplicate %YAML directive", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1193 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1194 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1195 if token.major != 1 || token.minor != 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1196 yaml_parser_set_parser_error(parser,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1197 "found incompatible YAML document", token.start_mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1198 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1199 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1200 version_directive = &yaml_version_directive_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1201 major: token.major,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1202 minor: token.minor,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1203 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1204 } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1205 value := yaml_tag_directive_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1206 handle: token.value,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1207 prefix: token.prefix,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1208 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1209 if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1210 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1211 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1212 tag_directives = append(tag_directives, value)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1213 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1214
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1215 skip_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1216 token = peek_token(parser)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1217 if token == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1218 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1219 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1220 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1221
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1222 for i := range default_tag_directives {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1223 if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1224 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1225 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1226 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1227
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1228 if version_directive_ref != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1229 *version_directive_ref = version_directive
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1230 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1231 if tag_directives_ref != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1232 *tag_directives_ref = tag_directives
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1233 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1234 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1235 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1236
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1237 // Append a tag directive to the directives stack.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1238 func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1239 for i := range parser.tag_directives {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1240 if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1241 if allow_duplicates {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1242 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1243 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1244 return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1245 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1246 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1247
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1248 // [Go] I suspect the copy is unnecessary. This was likely done
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1249 // because there was no way to track ownership of the data.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1250 value_copy := yaml_tag_directive_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1251 handle: make([]byte, len(value.handle)),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1252 prefix: make([]byte, len(value.prefix)),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1253 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1254 copy(value_copy.handle, value.handle)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1255 copy(value_copy.prefix, value.prefix)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1256 parser.tag_directives = append(parser.tag_directives, value_copy)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1257 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1258 }