function infix(s, f, p, w) {
    var x = symbol(s, p);
    reserveName(x);
    x.infix = true;
    x.led = function(context, left) {
      if (!w) {
        nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
      }
      if ((s === "in" || s === "instanceof") && left.id === "!") {
        warning("W018", left, "!");
      }
      if (typeof f === "function") {
        return f(context, left, this);
      } else {
        this.left = left;
        this.right = expression(context, p);
        return this;
      }
    };
    return x;
  }
Convenience function for defining "infix" symbols--operators that require
operands as both "land-hand side" and "right-hand side".

@param {string} s - the name of the symbol
@param {function} [f] - a function to be invoked that consumes the
                        right-hand side of the operator
@param {number} p - the left-binding power of the token as used by the
                    Pratt parsing semantics
@param {boolean} [w] - if `true`

@returns {object} - the object describing the JSHint symbol (provided to
                    support cases where further refinement is necessary)