parser: add support for normal and nested objects

This commit is contained in:
Fatih Arslan 2015-10-17 01:39:49 +03:00
parent 16d5eb5f08
commit 0ed9465e4b
2 changed files with 17 additions and 11 deletions

View File

@ -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)

View File

@ -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
}) })