From: Matthew Dempsky Date: Fri, 26 Feb 2016 01:16:42 +0000 (-0800) Subject: cmd/compile, go/parser: simpler binary expression parsing X-Git-Tag: go1.7beta1~1701 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=49d1e307108c4a52e65112926ce5f1acb04fd8d7;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- diff --git a/src/cmd/compile/internal/gc/parser.go b/src/cmd/compile/internal/gc/parser.go index 25754e5663..ffa20711b7 100644 --- a/src/cmd/compile/internal/gc/parser.go +++ b/src/cmd/compile/internal/gc/parser.go @@ -1142,17 +1142,14 @@ func (p *parser) bexpr(prec int) *Node { // don't trace bexpr - only leads to overly nested trace output x := p.uexpr() - t := prectab[p.tok] - for tprec := t.prec; tprec >= prec; tprec-- { - for tprec == prec { - p.next() - y := p.bexpr(t.prec + 1) - x = Nod(t.op, x, y) - t = prectab[p.tok] - tprec = t.prec + for { + t := prectab[p.tok] + if t.prec < prec { + return x } + p.next() + x = Nod(t.op, x, p.bexpr(t.prec+1)) } - return x } func (p *parser) expr() *Node { 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.