parser: simplfiy code

This commit is contained in:
Fatih Arslan 2015-10-16 14:16:12 +03:00
parent 628bc89026
commit f432878452
2 changed files with 45 additions and 30 deletions

View File

@ -56,6 +56,17 @@ func (p *Parser) parseObjectItem() (*ObjectItem, error) {
return nil, err
}
// either an assignment or object
switch p.tok.Type {
case scanner.ASSIGN:
case scanner.LBRACE:
if len(keys) > 1 {
// nested object
}
// object or nested object
}
switch len(keys) {
case 1:
// assignment or object
@ -85,42 +96,44 @@ func (p *Parser) parseObjectItem() (*ObjectItem, error) {
// parseObjectKey parses an object key and returns a ObjectKey AST
func (p *Parser) parseObjectKey() ([]*ObjectKey, error) {
tok := p.scan()
keys := make([]*ObjectKey, 0)
switch tok.Type {
case scanner.IDENT, scanner.STRING:
// add first found token
keys := []*ObjectKey{&ObjectKey{tok}}
nestedObj := false
// now we have three casses
// 1. assignment: KEY = NODE
// 2. object: KEY { }
// 2. nested object: KEY KEY2 ... KEYN {}
for {
tok := p.scan()
switch tok.Type {
case scanner.ASSIGN:
// assignment or object, but not nested objects
if nestedObj {
return nil, fmt.Errorf("nested object expected: LBRACE got: %s", tok.Type)
}
return keys, nil
case scanner.LBRACE:
// object
return keys, nil
case scanner.IDENT, scanner.STRING:
// nested object
nestedObj = true
keys = append(keys, &ObjectKey{
token: tok,
})
default:
return nil, fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", tok.Type)
}
}
keys = append(keys, &ObjectKey{token: tok})
default:
return nil, fmt.Errorf("expected: IDENT | STRING got: %s", tok.Type)
}
nestedObj := false
// we have three casses
// 1. assignment: KEY = NODE
// 2. object: KEY { }
// 2. nested object: KEY KEY2 ... KEYN {}
for {
tok := p.scan()
switch tok.Type {
case scanner.ASSIGN:
// assignment or object, but not nested objects
if nestedObj {
return nil, fmt.Errorf("nested object expected: LBRACE got: %s", tok.Type)
}
return keys, nil
case scanner.LBRACE:
// object
return keys, nil
case scanner.IDENT, scanner.STRING:
// nested object
nestedObj = true
keys = append(keys, &ObjectKey{token: tok})
default:
return nil, fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", tok.Type)
}
}
}
// parseLiteralType parses a literal type and returns a LiteralType AST

View File

@ -17,6 +17,8 @@ func TestObjectKey(t *testing.T) {
}{
{[]scanner.TokenType{scanner.IDENT}, `foo {}`},
{[]scanner.TokenType{scanner.IDENT}, `foo = {}`},
{[]scanner.TokenType{scanner.IDENT}, `foo = bar`},
{[]scanner.TokenType{scanner.IDENT}, `foo = 123`},
{[]scanner.TokenType{scanner.IDENT}, `foo = "${var.bar}`},
{[]scanner.TokenType{scanner.STRING}, `"foo" {}`},
{[]scanner.TokenType{scanner.STRING}, `"foo" = {}`},