code: func (t *tree) parseExpr(prec int) ast.Node {
  	n := t.parseExprFirstTerm()
  	var tok item
  	for {
  		tok = t.next()
  		q := precedence[tok.typ]
  		if !isBinaryOp(tok.typ) || q < prec {
  			break
  		}
  		q++
  		n = newBinaryOpNode(tok, n, t.parseExpr(q))
  	}
  	if prec == 0 && tok.typ == itemTernIf {
  		return t.parseTernary(n)
  	}
  	t.backup()
  	return n
  }
docs: // parseExpr parses an arbitrary expression involving function applications and
  // arithmetic.
  //
  // For handling binary operators, we use the Precedence Climbing algorithm described in:
  //   http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm