// 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 {
}
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.