diff options
author | Matthew Dempsky <mdempsky@google.com> | 2016-02-25 17:16:42 -0800 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2016-02-26 06:33:57 +0000 |
commit | 49d1e307108c4a52e65112926ce5f1acb04fd8d7 (patch) | |
tree | e5a9867f416d75970f780c703d58367a08c009c9 /src/go/parser/parser.go | |
parent | c8579e57cb1f1c32a99dd57314c5ced1a457dde3 (diff) | |
download | go-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.go | 26 |
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. |