toml: improve array parsing (#12322)
							parent
							
								
									43fbc68f1e
								
							
						
					
					
						commit
						bc3827ae15
					
				|  | @ -508,15 +508,32 @@ pub fn (mut p Parser) array() ?[]ast.Value { | |||
| 	util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing array...') | ||||
| 	mut arr := []ast.Value{} | ||||
| 	p.expect(.lsbr) ? // '[' bracket
 | ||||
| 	mut previous_token_was_value := false | ||||
| 	for p.tok.kind != .eof { | ||||
| 		p.next() ? | ||||
| 		util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing token "$p.tok.kind" "$p.tok.lit"') | ||||
| 
 | ||||
| 		if previous_token_was_value { | ||||
| 			if p.tok.kind != .rsbr && p.tok.kind != .hash { | ||||
| 				p.expect(.comma) ? | ||||
| 			} | ||||
| 			previous_token_was_value = false | ||||
| 		} | ||||
| 
 | ||||
| 		match p.tok.kind { | ||||
| 			.boolean { | ||||
| 				arr << ast.Value(p.boolean() ?) | ||||
| 				previous_token_was_value = true | ||||
| 			} | ||||
| 			.comma { | ||||
| 				util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comma array value seperator "$p.tok.lit"') | ||||
| 				// Trailing commas before array close is allowed
 | ||||
| 				// so we skip `if p.peek_tok.kind == .rsbr { ... }`
 | ||||
| 				if p.peek_tok.kind == .comma { | ||||
| 					p.next() ? // Forward to the peek_tok
 | ||||
| 					return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 						' unexpected "$p.tok.kind" "$p.tok.lit" at this (excerpt): "...${p.excerpt()}..."') | ||||
| 				} | ||||
| 				util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comma table value seperator "$p.tok.lit"') | ||||
| 				continue | ||||
| 			} | ||||
| 			.eof { | ||||
|  | @ -524,25 +541,29 @@ pub fn (mut p Parser) array() ?[]ast.Value { | |||
| 					' could not parse array. Reached EOF "$p.tok.kind" "$p.tok.lit" ("$p.tok.lit") in this (excerpt): "...${p.excerpt()}..."') | ||||
| 			} | ||||
| 			.hash { | ||||
| 				// TODO array.comments << p.comment()
 | ||||
| 				c := p.comment() | ||||
| 				p.ast_root.comments << c | ||||
| 				util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comment "$c.text"') | ||||
| 			} | ||||
| 			.lcbr { | ||||
| 				mut t := map[string]ast.Value{} | ||||
| 				p.inline_table(mut t) ? | ||||
| 				ast.Value(t) | ||||
| 				arr << ast.Value(t) | ||||
| 				previous_token_was_value = true | ||||
| 			} | ||||
| 			.number { | ||||
| 				val := p.number_or_date() ? | ||||
| 				arr << val | ||||
| 				previous_token_was_value = true | ||||
| 			} | ||||
| 			.quoted { | ||||
| 				arr << ast.Value(p.quoted()) | ||||
| 				previous_token_was_value = true | ||||
| 			} | ||||
| 			.lsbr { | ||||
| 				util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing array in array "$p.tok.kind" "$p.tok.lit"') | ||||
| 				arr << ast.Value(p.array() ?) | ||||
| 				previous_token_was_value = true | ||||
| 			} | ||||
| 			.rsbr { | ||||
| 				break | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ const ( | |||
| 		'table/duplicate-table-array.toml', | ||||
| 		// Array
 | ||||
| 		'array/tables-1.toml', | ||||
| 		'array/missing-separator.toml', | ||||
| 		//'array/missing-separator.toml',
 | ||||
| 		'array/text-after-array-entries.toml', | ||||
| 		'array/text-before-array-separator.toml', | ||||
| 		// Date / Time
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue