From da1627bbbe8be1c2c67cf6996507f252d81687d8 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 19 Nov 2009 16:42:05 -0800 Subject: Permit omission of hi bound in slices. R=r, rsc http://codereview.appspot.com/157082 --- src/pkg/go/parser/parser.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'src/pkg/go/parser/parser.go') 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: -- cgit v1.2.3