_toString (options) {
      const parenthesis =
          (options && options.parenthesis) ? options.parenthesis : 'keep'
      const precedence =
          getPrecedence(this, parenthesis, options && options.implicit)

      // Enclose Arguments in parentheses if they are an OperatorNode
      // or have lower or equal precedence
      // NOTE: enclosing all OperatorNodes in parentheses is a decision
      // purely based on aesthetics and readability
      let condition = this.condition.toString(options)
      const conditionPrecedence =
          getPrecedence(this.condition, parenthesis, options && options.implicit)
      if ((parenthesis === 'all') ||
          (this.condition.type === 'OperatorNode') ||
          ((conditionPrecedence !== null) &&
              (conditionPrecedence <= precedence))) {
        condition = '(' + condition + ')'
      }

      let trueExpr = this.trueExpr.toString(options)
      const truePrecedence =
          getPrecedence(this.trueExpr, parenthesis, options && options.implicit)
      if ((parenthesis === 'all') ||
          (this.trueExpr.type === 'OperatorNode') ||
          ((truePrecedence !== null) && (truePrecedence <= precedence))) {
        trueExpr = '(' + trueExpr + ')'
      }

      let falseExpr = this.falseExpr.toString(options)
      const falsePrecedence =
          getPrecedence(this.falseExpr, parenthesis, options && options.implicit)
      if ((parenthesis === 'all') ||
          (this.falseExpr.type === 'OperatorNode') ||
          ((falsePrecedence !== null) && (falsePrecedence <= precedence))) {
        falseExpr = '(' + falseExpr + ')'
      }
      return condition + ' ? ' + trueExpr + ' : ' + falseExpr
    }
Get string representation
@param {Object} options
@return {string} str