parserc.go 38 KB

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