aboutsummaryrefslogtreecommitdiff
path: root/src/go/parser/parser.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2016-02-25 17:16:42 -0800
committerMatthew Dempsky <mdempsky@google.com>2016-02-26 06:33:57 +0000
commit49d1e307108c4a52e65112926ce5f1acb04fd8d7 (patch)
treee5a9867f416d75970f780c703d58367a08c009c9 /src/go/parser/parser.go
parentc8579e57cb1f1c32a99dd57314c5ced1a457dde3 (diff)
downloadgo-49d1e307108c4a52e65112926ce5f1acb04fd8d7.tar.gz
go-49d1e307108c4a52e65112926ce5f1acb04fd8d7.zip
cmd/compile, go/parser: simpler binary expression parsing
The existing nested loops are too tricky for me to grok and don't seem necessary. Change-Id: I75c65c8470b799d6f4cfb05bb1b4796c5d7d32e7 Reviewed-on: https://go-review.googlesource.com/19927 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/go/parser/parser.go')
-rw-r--r--src/go/parser/parser.go26
1 files changed, 11 insertions, 15 deletions
diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go
index f3a26032ee..d3ef7db31e 100644
--- a/src/go/parser/parser.go
+++ b/src/go/parser/parser.go
@@ -1597,23 +1597,19 @@ func (p *parser) parseBinaryExpr(lhs bool, prec1 int) ast.Expr {
}
x := p.parseUnaryExpr(lhs)
- for _, prec := p.tokPrec(); prec >= prec1; prec-- {
- for {
- op, oprec := p.tokPrec()
- if oprec != prec {
- break
- }
- pos := p.expect(op)
- if lhs {
- p.resolve(x)
- lhs = false
- }
- y := p.parseBinaryExpr(false, prec+1)
- x = &ast.BinaryExpr{X: p.checkExpr(x), OpPos: pos, Op: op, Y: p.checkExpr(y)}
+ for {
+ op, oprec := p.tokPrec()
+ if oprec < prec1 {
+ return x
+ }
+ pos := p.expect(op)
+ if lhs {
+ p.resolve(x)
+ lhs = false
}
+ y := p.parseBinaryExpr(false, oprec+1)
+ x = &ast.BinaryExpr{X: p.checkExpr(x), OpPos: pos, Op: op, Y: p.checkExpr(y)}
}
-
- return x
}
// If lhs is set and the result is an identifier, it is not resolved.