code: function(expr) {
      var inputStream = this.inputStream;
      var origNumBindings = this._bindings.length;
  
      var origRecordedFailures;
      if (this.recordedFailures) {
        origRecordedFailures = this.recordedFailures;
        this.recordedFailures = Object.create(null);
      }
  
      var origPos = inputStream.pos;
      var memoPos = this.maybeSkipSpacesBefore(expr);
  
      var origTrace;
      if (this.trace) {
        origTrace = this.trace;
        this.trace = [];
      }
  
      // Do the actual evaluation.
      var ans = expr.eval(this);
  
      if (this.trace) {
        var bindings = this._bindings.slice(origNumBindings);
        var traceEntry = this.getTraceEntry(memoPos, expr, ans, bindings);
        traceEntry.isImplicitSpaces = expr === applySpaces;
        traceEntry.isRootNode = expr === this.startExpr;
        origTrace.push(traceEntry);
        this.trace = origTrace;
      }
  
      if (ans) {
        if (this.recordedFailures && inputStream.pos === this.positionToRecordFailures) {
          var self = this;
          Object.keys(this.recordedFailures).forEach(function(key) {
            self.recordedFailures[key].makeFluffy();
          });
        }
      } else {
        // Reset the position and the bindings.
        inputStream.pos = origPos;
        this.truncateBindings(origNumBindings);
      }
  
      if (this.recordedFailures) {
        this.recordFailures(origRecordedFailures, false);
      }
  
      return ans;
    }
docs: Evaluate `expr` and return `true` if it succeeded, `false` otherwise. On success, `bindings` will have `expr.getArity()` more elements than before, and the input stream's position may have increased. On failure, `bindings` and position will be unchanged.