code: function(first, startLine, startCol){
          var delim   = first,
              string  = first,
              reader  = this._reader,
              prev    = first,
              tt      = Tokens.STRING,
              c       = reader.read();
              
          while(c){
              string += c;
              
              //if the delimiter is found with an escapement, we're done.
              if (c == delim && prev != "\\"){
                  break;
              }
  
              //if there's a newline without an escapement, it's an invalid string
              if (isNewLine(reader.peek()) && c != "\\"){
                  tt = Tokens.INVALID;
                  break;
              }
          
              //save previous and get next
              prev = c;
              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);        
      }
docs: Produces a string token based on the given character
  and location in the stream. Since strings may be indicated
  by single or double quotes, a failure to match starting
  and ending quotes results in an INVALID token being generated.
  The first character in the string is passed in and then
  the rest are read up to and including the final quotation mark.
  @param {String} first The first character in the string.
  @param {int} startLine The beginning line for the character.
  @param {int} startCol The beginning column for the character.
  @return {Object} A token object.
  @method stringToken