aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/hashicorp/hcl/hcl/parser/parser.go')
-rw-r--r--vendor/github.com/hashicorp/hcl/hcl/parser/parser.go24
1 files changed, 18 insertions, 6 deletions
diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
index 0aa080f..54a6493 100644
--- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
+++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
@@ -50,7 +50,7 @@ func (p *Parser) Parse() (*ast.File, error) {
scerr = &PosError{Pos: pos, Err: errors.New(msg)}
}
- f.Node, err = p.objectList()
+ f.Node, err = p.objectList(false)
if scerr != nil {
return nil, scerr
}
@@ -62,11 +62,23 @@ func (p *Parser) Parse() (*ast.File, error) {
return f, nil
}
-func (p *Parser) objectList() (*ast.ObjectList, error) {
+// objectList parses a list of items within an object (generally k/v pairs).
+// The parameter" obj" tells this whether to we are within an object (braces:
+// '{', '}') or just at the top level. If we're within an object, we end
+// at an RBRACE.
+func (p *Parser) objectList(obj bool) (*ast.ObjectList, error) {
defer un(trace(p, "ParseObjectList"))
node := &ast.ObjectList{}
for {
+ if obj {
+ tok := p.scan()
+ p.unscan()
+ if tok.Type == token.RBRACE {
+ break
+ }
+ }
+
n, err := p.objectItem()
if err == errEofToken {
break // we are finished
@@ -288,7 +300,7 @@ func (p *Parser) objectType() (*ast.ObjectType, error) {
Lbrace: p.tok.Pos,
}
- l, err := p.objectList()
+ l, err := p.objectList(true)
// if we hit RBRACE, we are good to go (means we parsed all Items), if it's
// not a RBRACE, it's an syntax error and we just return it.
@@ -296,9 +308,9 @@ func (p *Parser) objectType() (*ast.ObjectType, error) {
return nil, err
}
- // If there is no error, we should be at a RBRACE to end the object
- if p.tok.Type != token.RBRACE {
- return nil, fmt.Errorf("object expected closing RBRACE got: %s", p.tok.Type)
+ // No error, scan and expect the ending to be a brace
+ if tok := p.scan(); tok.Type != token.RBRACE {
+ return nil, fmt.Errorf("object expected closing RBRACE got: %s", tok.Type)
}
o.List = l