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...')
|
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing array...')
|
||||||
mut arr := []ast.Value{}
|
mut arr := []ast.Value{}
|
||||||
p.expect(.lsbr) ? // '[' bracket
|
p.expect(.lsbr) ? // '[' bracket
|
||||||
|
mut previous_token_was_value := false
|
||||||
for p.tok.kind != .eof {
|
for p.tok.kind != .eof {
|
||||||
p.next() ?
|
p.next() ?
|
||||||
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing token "$p.tok.kind" "$p.tok.lit"')
|
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 {
|
match p.tok.kind {
|
||||||
.boolean {
|
.boolean {
|
||||||
arr << ast.Value(p.boolean() ?)
|
arr << ast.Value(p.boolean() ?)
|
||||||
|
previous_token_was_value = true
|
||||||
}
|
}
|
||||||
.comma {
|
.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
|
continue
|
||||||
}
|
}
|
||||||
.eof {
|
.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()}..."')
|
' could not parse array. Reached EOF "$p.tok.kind" "$p.tok.lit" ("$p.tok.lit") in this (excerpt): "...${p.excerpt()}..."')
|
||||||
}
|
}
|
||||||
.hash {
|
.hash {
|
||||||
// TODO array.comments << p.comment()
|
|
||||||
c := p.comment()
|
c := p.comment()
|
||||||
|
p.ast_root.comments << c
|
||||||
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comment "$c.text"')
|
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comment "$c.text"')
|
||||||
}
|
}
|
||||||
.lcbr {
|
.lcbr {
|
||||||
mut t := map[string]ast.Value{}
|
mut t := map[string]ast.Value{}
|
||||||
p.inline_table(mut t) ?
|
p.inline_table(mut t) ?
|
||||||
ast.Value(t)
|
arr << ast.Value(t)
|
||||||
|
previous_token_was_value = true
|
||||||
}
|
}
|
||||||
.number {
|
.number {
|
||||||
val := p.number_or_date() ?
|
val := p.number_or_date() ?
|
||||||
arr << val
|
arr << val
|
||||||
|
previous_token_was_value = true
|
||||||
}
|
}
|
||||||
.quoted {
|
.quoted {
|
||||||
arr << ast.Value(p.quoted())
|
arr << ast.Value(p.quoted())
|
||||||
|
previous_token_was_value = true
|
||||||
}
|
}
|
||||||
.lsbr {
|
.lsbr {
|
||||||
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing array in array "$p.tok.kind" "$p.tok.lit"')
|
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing array in array "$p.tok.kind" "$p.tok.lit"')
|
||||||
arr << ast.Value(p.array() ?)
|
arr << ast.Value(p.array() ?)
|
||||||
|
previous_token_was_value = true
|
||||||
}
|
}
|
||||||
.rsbr {
|
.rsbr {
|
||||||
break
|
break
|
||||||
|
|
|
@ -23,7 +23,7 @@ const (
|
||||||
'table/duplicate-table-array.toml',
|
'table/duplicate-table-array.toml',
|
||||||
// Array
|
// Array
|
||||||
'array/tables-1.toml',
|
'array/tables-1.toml',
|
||||||
'array/missing-separator.toml',
|
//'array/missing-separator.toml',
|
||||||
'array/text-after-array-entries.toml',
|
'array/text-after-array-entries.toml',
|
||||||
'array/text-before-array-separator.toml',
|
'array/text-before-array-separator.toml',
|
||||||
// Date / Time
|
// Date / Time
|
||||||
|
|
Loading…
Reference in New Issue