diff options
author | Robert Griesemer <gri@golang.org> | 2009-11-19 16:42:05 -0800 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2009-11-19 16:42:05 -0800 |
commit | da1627bbbe8be1c2c67cf6996507f252d81687d8 (patch) | |
tree | 5fa2a8b9b0bd044c80b7723ab53d1c27f83e31b1 /src/pkg/go/parser/parser.go | |
parent | f79f90ce049e525bc39622aa1d2b4ab17ceb2d49 (diff) | |
download | golang-da1627bbbe8be1c2c67cf6996507f252d81687d8.tar.gz |
Permit omission of hi bound in slices.
R=r, rsc
http://codereview.appspot.com/157082
Diffstat (limited to 'src/pkg/go/parser/parser.go')
-rw-r--r-- | src/pkg/go/parser/parser.go | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go index ba91ceb52..1195a24fa 100644 --- a/src/pkg/go/parser/parser.go +++ b/src/pkg/go/parser/parser.go @@ -962,23 +962,28 @@ func (p *parser) parseSelectorOrTypeAssertion(x ast.Expr) ast.Expr { } -func (p *parser) parseIndex(x ast.Expr) ast.Expr { +func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr { if p.trace { - defer un(trace(p, "Index")) + defer un(trace(p, "IndexOrSlice")) } p.expect(token.LBRACK); p.exprLev++; - begin := p.parseExpr(); - var end ast.Expr; + index := p.parseExpr(); if p.tok == token.COLON { p.next(); - end = p.parseExpr(); + var end ast.Expr; + if p.tok != token.RBRACK { + end = p.parseExpr() + } + x = &ast.SliceExpr{x, index, end}; + } else { + x = &ast.IndexExpr{x, index} } p.exprLev--; p.expect(token.RBRACK); - return &ast.IndexExpr{x, begin, end}; + return x; } @@ -1072,6 +1077,7 @@ func (p *parser) checkExpr(x ast.Expr) ast.Expr { case *ast.ParenExpr: case *ast.SelectorExpr: case *ast.IndexExpr: + case *ast.SliceExpr: case *ast.TypeAssertExpr: if t.Type == nil { // the form X.(type) is only allowed in type switch expressions @@ -1168,7 +1174,7 @@ L: for { case token.PERIOD: x = p.parseSelectorOrTypeAssertion(p.checkExpr(x)) case token.LBRACK: - x = p.parseIndex(p.checkExpr(x)) + x = p.parseIndexOrSlice(p.checkExpr(x)) case token.LPAREN: x = p.parseCallOrConversion(p.checkExprOrType(x)) case token.LBRACE: |