Inline tables
This commit is contained in:
@@ -30,6 +30,9 @@ type builder interface {
|
|||||||
ArrayBegin()
|
ArrayBegin()
|
||||||
ArrayEnd()
|
ArrayEnd()
|
||||||
ArraySeparator()
|
ArraySeparator()
|
||||||
|
InlineTableBegin()
|
||||||
|
InlineTableEnd()
|
||||||
|
InlineTableSeparator()
|
||||||
}
|
}
|
||||||
|
|
||||||
type position struct {
|
type position struct {
|
||||||
@@ -41,6 +44,18 @@ type documentBuilder struct {
|
|||||||
document Document
|
document Document
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *documentBuilder) InlineTableSeparator() {
|
||||||
|
fmt.Println(", InlineTable SEPARATOR")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *documentBuilder) InlineTableBegin() {
|
||||||
|
fmt.Println("{ InlineTable BEGIN")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *documentBuilder) InlineTableEnd() {
|
||||||
|
fmt.Println("} InlineTable END")
|
||||||
|
}
|
||||||
|
|
||||||
func (d *documentBuilder) ArraySeparator() {
|
func (d *documentBuilder) ArraySeparator() {
|
||||||
fmt.Println(", ARRAY SEPARATOR")
|
fmt.Println(", ARRAY SEPARATOR")
|
||||||
}
|
}
|
||||||
@@ -358,12 +373,81 @@ func (p *parser) parseVal() error {
|
|||||||
return p.parseString()
|
return p.parseString()
|
||||||
case '[':
|
case '[':
|
||||||
return p.parseArray()
|
return p.parseArray()
|
||||||
|
case '{':
|
||||||
|
return p.parseInlineTable()
|
||||||
// TODO
|
// TODO
|
||||||
default:
|
default:
|
||||||
return &InvalidCharacter{r: r}
|
return &InvalidCharacter{r: r}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *parser) parseInlineTable() error {
|
||||||
|
//inline-table = inline-table-open [ inline-table-keyvals ] inline-table-close
|
||||||
|
//
|
||||||
|
//inline-table-open = %x7B ws ; {
|
||||||
|
// inline-table-close = ws %x7D ; }
|
||||||
|
//inline-table-sep = ws %x2C ws ; , Comma
|
||||||
|
//
|
||||||
|
//inline-table-keyvals = keyval [ inline-table-sep inline-table-keyvals ]
|
||||||
|
|
||||||
|
err := p.expect('{')
|
||||||
|
if err != nil {
|
||||||
|
panic("inline tables should start with {")
|
||||||
|
}
|
||||||
|
p.ignore()
|
||||||
|
p.builder.InlineTableBegin()
|
||||||
|
|
||||||
|
err = p.parseWhitespace()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r := p.peek()
|
||||||
|
if r == '}' {
|
||||||
|
p.next()
|
||||||
|
p.ignore()
|
||||||
|
p.builder.InlineTableEnd()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
err = p.parseKeyval()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
err = p.parseWhitespace()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r := p.peek()
|
||||||
|
if r == '}' {
|
||||||
|
p.next()
|
||||||
|
p.ignore()
|
||||||
|
p.builder.InlineTableEnd()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
err := p.expect(',')
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
p.builder.InlineTableSeparator()
|
||||||
|
p.ignore()
|
||||||
|
|
||||||
|
err = p.parseWhitespace()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = p.parseKeyval()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (p *parser) parseArray() error {
|
func (p *parser) parseArray() error {
|
||||||
//array = array-open [ array-values ] ws-comment-newline array-close
|
//array = array-open [ array-values ] ws-comment-newline array-close
|
||||||
|
|
||||||
@@ -371,6 +455,7 @@ func (p *parser) parseArray() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic("arrays should start with [")
|
panic("arrays should start with [")
|
||||||
}
|
}
|
||||||
|
p.ignore()
|
||||||
|
|
||||||
p.builder.ArrayBegin()
|
p.builder.ArrayBegin()
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ var inputs = []string{
|
|||||||
`c = [[[]]]`,
|
`c = [[[]]]`,
|
||||||
`d = ["foo","bar"]`,
|
`d = ["foo","bar"]`,
|
||||||
`d = ["foo", "test"]`,
|
`d = ["foo", "test"]`,
|
||||||
|
`d = {}`,
|
||||||
|
`e = {f = "bar"}`,
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParse(t *testing.T) {
|
func TestParse(t *testing.T) {
|
||||||
@@ -45,6 +47,9 @@ func TestParse(t *testing.T) {
|
|||||||
type noopBuilder struct {
|
type noopBuilder struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n noopBuilder) InlineTableSeparator() {}
|
||||||
|
func (n noopBuilder) InlineTableBegin() {}
|
||||||
|
func (n noopBuilder) InlineTableEnd() {}
|
||||||
func (n noopBuilder) ArraySeparator() {}
|
func (n noopBuilder) ArraySeparator() {}
|
||||||
func (n noopBuilder) ArrayBegin() {}
|
func (n noopBuilder) ArrayBegin() {}
|
||||||
func (n noopBuilder) ArrayEnd() {}
|
func (n noopBuilder) ArrayEnd() {}
|
||||||
|
|||||||
Reference in New Issue
Block a user