docs: function(first, startLine, startCol) {
          var delim   = first,
              string  = first,
              reader  = this._reader,
              tt      = Tokens.STRING,
              c       = reader.read(),
              i;
  
          while (c) {
              string += c;
  
              if (c === "\\") {
                  c = reader.read();
                  if (c === null) {
                      break; // premature EOF after backslash
                  } else if (/[^\r\n\f0-9a-f]/i.test(c)) {
                      // single-character escape
                      string += c;
                  } else {
                      // read up to six hex digits
                      for (i=0; isHexDigit(c) && i<6; i++) {
                          string += c;
                          c = reader.read();
                      }
                      // swallow trailing newline or space
                      if (c === "\r" && reader.peek() === "\n") {
                          string += c;
                          c = reader.read();
                      }
                      if (isWhitespace(c)) {
                          string += c;
                      } else {
                          // This character is null or not part of the escape;
                          // jump back to the top to process it.
                          continue;
                      }
                  }
              } else if (c === delim) {
                  break; // delimiter found.
              } else if (isNewLine(reader.peek())) {
                  // newline without an escapement: it's an invalid string
                  tt = Tokens.INVALID;
                  break;
              }
              c = reader.read();
          }
  
          //if c is null, that means we're out of input and the string was never closed
          if (c === null) {
              tt = Tokens.INVALID;
          }
  
          return this.createToken(tt, string, startLine, startCol);
      }