parser: simplfiy code
This commit is contained in:
parent
628bc89026
commit
f432878452
@ -56,6 +56,17 @@ func (p *Parser) parseObjectItem() (*ObjectItem, error) {
|
|||||||
return nil, err
|
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) {
|
switch len(keys) {
|
||||||
case 1:
|
case 1:
|
||||||
// assignment or object
|
// assignment or object
|
||||||
@ -85,13 +96,20 @@ func (p *Parser) parseObjectItem() (*ObjectItem, error) {
|
|||||||
// parseObjectKey parses an object key and returns a ObjectKey AST
|
// parseObjectKey parses an object key and returns a ObjectKey AST
|
||||||
func (p *Parser) parseObjectKey() ([]*ObjectKey, error) {
|
func (p *Parser) parseObjectKey() ([]*ObjectKey, error) {
|
||||||
tok := p.scan()
|
tok := p.scan()
|
||||||
|
|
||||||
|
keys := make([]*ObjectKey, 0)
|
||||||
|
|
||||||
switch tok.Type {
|
switch tok.Type {
|
||||||
case scanner.IDENT, scanner.STRING:
|
case scanner.IDENT, scanner.STRING:
|
||||||
// add first found token
|
// add first found token
|
||||||
keys := []*ObjectKey{&ObjectKey{tok}}
|
keys = append(keys, &ObjectKey{token: tok})
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("expected: IDENT | STRING got: %s", tok.Type)
|
||||||
|
}
|
||||||
|
|
||||||
nestedObj := false
|
nestedObj := false
|
||||||
|
|
||||||
// now we have three casses
|
// we have three casses
|
||||||
// 1. assignment: KEY = NODE
|
// 1. assignment: KEY = NODE
|
||||||
// 2. object: KEY { }
|
// 2. object: KEY { }
|
||||||
// 2. nested object: KEY KEY2 ... KEYN {}
|
// 2. nested object: KEY KEY2 ... KEYN {}
|
||||||
@ -111,16 +129,11 @@ func (p *Parser) parseObjectKey() ([]*ObjectKey, error) {
|
|||||||
case scanner.IDENT, scanner.STRING:
|
case scanner.IDENT, scanner.STRING:
|
||||||
// nested object
|
// nested object
|
||||||
nestedObj = true
|
nestedObj = true
|
||||||
keys = append(keys, &ObjectKey{
|
keys = append(keys, &ObjectKey{token: tok})
|
||||||
token: tok,
|
|
||||||
})
|
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", tok.Type)
|
return nil, fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", tok.Type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("expected: IDENT | STRING got: %s", tok.Type)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseLiteralType parses a literal type and returns a LiteralType AST
|
// parseLiteralType parses a literal type and returns a LiteralType AST
|
||||||
|
@ -17,6 +17,8 @@ func TestObjectKey(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{[]scanner.TokenType{scanner.IDENT}, `foo {}`},
|
{[]scanner.TokenType{scanner.IDENT}, `foo {}`},
|
||||||
{[]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.IDENT}, `foo = "${var.bar}`},
|
||||||
{[]scanner.TokenType{scanner.STRING}, `"foo" {}`},
|
{[]scanner.TokenType{scanner.STRING}, `"foo" {}`},
|
||||||
{[]scanner.TokenType{scanner.STRING}, `"foo" = {}`},
|
{[]scanner.TokenType{scanner.STRING}, `"foo" = {}`},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user