Standard tables in parser
This commit is contained in:
@@ -71,7 +71,7 @@ func (p *parser) parseExpression(b []byte) ([]byte, error) {
|
|||||||
var err error
|
var err error
|
||||||
var node ast.Node
|
var node ast.Node
|
||||||
if b[0] == '[' {
|
if b[0] == '[' {
|
||||||
b, err = p.parseTable(b)
|
node, b, err = p.parseTable(b)
|
||||||
} else {
|
} else {
|
||||||
node, b, err = p.parseKeyval(b)
|
node, b, err = p.parseKeyval(b)
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ func (p *parser) parseExpression(b []byte) ([]byte, error) {
|
|||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) parseTable(b []byte) ([]byte, error) {
|
func (p *parser) parseTable(b []byte) (ast.Node, []byte, error) {
|
||||||
//table = std-table / array-table
|
//table = std-table / array-table
|
||||||
if len(b) > 1 && b[1] == '[' {
|
if len(b) > 1 && b[1] == '[' {
|
||||||
return p.parseArrayTable(b)
|
return p.parseArrayTable(b)
|
||||||
@@ -99,7 +99,7 @@ func (p *parser) parseTable(b []byte) ([]byte, error) {
|
|||||||
return p.parseStdTable(b)
|
return p.parseStdTable(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) parseArrayTable(b []byte) ([]byte, error) {
|
func (p *parser) parseArrayTable(b []byte) (ast.Node, []byte, error) {
|
||||||
//array-table = array-table-open key array-table-close
|
//array-table = array-table-open key array-table-close
|
||||||
//array-table-open = %x5B.5B ws ; [[ Double left square bracket
|
//array-table-open = %x5B.5B ws ; [[ Double left square bracket
|
||||||
//array-table-close = ws %x5D.5D ; ]] Double right square bracket
|
//array-table-close = ws %x5D.5D ; ]] Double right square bracket
|
||||||
@@ -118,26 +118,30 @@ func (p *parser) parseArrayTable(b []byte) ([]byte, error) {
|
|||||||
//}
|
//}
|
||||||
//return expect(']', b)
|
//return expect(']', b)
|
||||||
|
|
||||||
return nil, nil
|
return ast.NoNode, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) parseStdTable(b []byte) ([]byte, error) {
|
func (p *parser) parseStdTable(b []byte) (ast.Node, []byte, error) {
|
||||||
//std-table = std-table-open key std-table-close
|
//std-table = std-table-open key std-table-close
|
||||||
//std-table-open = %x5B ws ; [ Left square bracket
|
//std-table-open = %x5B ws ; [ Left square bracket
|
||||||
//std-table-close = ws %x5D ; ] Right square bracket
|
//std-table-close = ws %x5D ; ] Right square bracket
|
||||||
|
|
||||||
// TODO
|
node := ast.Node{
|
||||||
//b = b[1:]
|
Kind: ast.Table,
|
||||||
//b = p.parseWhitespace(b)
|
}
|
||||||
//b, err := p.parseKey(b)
|
|
||||||
//if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
//}
|
|
||||||
//b = p.parseWhitespace(b)
|
|
||||||
//
|
|
||||||
//return expect(']', b)
|
|
||||||
|
|
||||||
return nil, nil
|
b = b[1:]
|
||||||
|
b = p.parseWhitespace(b)
|
||||||
|
key, b, err := p.parseKey(b)
|
||||||
|
if err != nil {
|
||||||
|
return ast.NoNode, nil, err
|
||||||
|
}
|
||||||
|
node.Children = key
|
||||||
|
b = p.parseWhitespace(b)
|
||||||
|
|
||||||
|
b, err = expect(']', b)
|
||||||
|
|
||||||
|
return node, b, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) parseKeyval(b []byte) (ast.Node, []byte, error) {
|
func (p *parser) parseKeyval(b []byte) (ast.Node, []byte, error) {
|
||||||
|
|||||||
@@ -71,6 +71,23 @@ func TestUnmarshal(t *testing.T) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "standard table",
|
||||||
|
input: `[A]
|
||||||
|
B = "data"`,
|
||||||
|
gen: func() test {
|
||||||
|
type A struct {
|
||||||
|
B string
|
||||||
|
}
|
||||||
|
type doc struct {
|
||||||
|
A A
|
||||||
|
}
|
||||||
|
return test{
|
||||||
|
&doc{},
|
||||||
|
&doc{A: A{B: "data"}},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
desc: "inline table",
|
desc: "inline table",
|
||||||
input: `Name = {First = "hello", Last = "world"}`,
|
input: `Name = {First = "hello", Last = "world"}`,
|
||||||
|
|||||||
Reference in New Issue
Block a user