summaryrefslogtreecommitdiff
path: root/src/pkg/go/parser/parser.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2009-11-19 16:42:05 -0800
committerRobert Griesemer <gri@golang.org>2009-11-19 16:42:05 -0800
commitda1627bbbe8be1c2c67cf6996507f252d81687d8 (patch)
tree5fa2a8b9b0bd044c80b7723ab53d1c27f83e31b1 /src/pkg/go/parser/parser.go
parentf79f90ce049e525bc39622aa1d2b4ab17ceb2d49 (diff)
downloadgolang-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.go20
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: