parser: add support for normal and nested objects
This commit is contained in:
parent
16d5eb5f08
commit
0ed9465e4b
@ -42,8 +42,13 @@ func (p *Parser) parseObjectList() (*ast.ObjectList, error) {
|
|||||||
if err == errEofToken {
|
if err == errEofToken {
|
||||||
break // we are finished
|
break // we are finished
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
if p.tok.Type != token.RBRACE {
|
||||||
|
return nil, err
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we successfully parsed a node, add it to the final source node
|
// we successfully parsed a node, add it to the final source node
|
||||||
@ -62,9 +67,9 @@ func (p *Parser) parseObjectItem() (*ast.ObjectItem, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// either an assignment or object
|
|
||||||
switch p.tok.Type {
|
switch p.tok.Type {
|
||||||
case token.ASSIGN:
|
case token.ASSIGN:
|
||||||
|
// assignments
|
||||||
o := &ast.ObjectItem{
|
o := &ast.ObjectItem{
|
||||||
Keys: keys,
|
Keys: keys,
|
||||||
Assign: p.tok.Pos,
|
Assign: p.tok.Pos,
|
||||||
@ -74,16 +79,18 @@ func (p *Parser) parseObjectItem() (*ast.ObjectItem, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return o, nil
|
return o, nil
|
||||||
case token.LBRACE:
|
case token.LBRACE:
|
||||||
if len(keys) > 1 {
|
// object or nested objects
|
||||||
// nested object
|
o := &ast.ObjectItem{
|
||||||
panic("nested object is not implemented")
|
Keys: keys,
|
||||||
}
|
}
|
||||||
|
|
||||||
// object
|
o.Val, err = p.parseObjectType()
|
||||||
panic("normal object is not implemented")
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("not yet implemented: %s", p.tok.Type)
|
return nil, fmt.Errorf("not yet implemented: %s", p.tok.Type)
|
||||||
|
@ -12,9 +12,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestParseType(t *testing.T) {
|
func TestParseType(t *testing.T) {
|
||||||
src := `foo = {
|
src := `foo {
|
||||||
fatih = "true"
|
fatih = "true"
|
||||||
arslan = "deneme"
|
|
||||||
}`
|
}`
|
||||||
|
|
||||||
p := New([]byte(src))
|
p := New([]byte(src))
|
||||||
@ -28,12 +27,12 @@ func TestParseType(t *testing.T) {
|
|||||||
ast.Walk(node, func(n ast.Node) bool {
|
ast.Walk(node, func(n ast.Node) bool {
|
||||||
if list, ok := n.(*ast.ObjectList); ok {
|
if list, ok := n.(*ast.ObjectList); ok {
|
||||||
for _, l := range list.Items {
|
for _, l := range list.Items {
|
||||||
|
fmt.Printf("l = %+v\n", l)
|
||||||
for _, k := range l.Keys {
|
for _, k := range l.Keys {
|
||||||
fmt.Printf("key = %+v\n", k)
|
fmt.Printf("key = %+v\n", k)
|
||||||
}
|
}
|
||||||
fmt.Printf("val = %+v\n", l.Val)
|
fmt.Printf("val = %+v\n", l.Val)
|
||||||
}
|
}
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user