docs: function() {
  
          var c,
              reader = this._reader,
              token   = null,
              startLine   = reader.getLine(),
              startCol    = reader.getCol(),
              start       = reader.getCursor(); //ORION AST Generation
  
          c = reader.read();
  
  
          while (c) {
              switch (c) {
  
                  /*
                   * Potential tokens:
                   * - COMMENT
                   * - SLASH
                   * - CHAR
                   */
                  case "/":
  
                      if (reader.peek() === "*") {
                          token = this.commentToken(c, startLine, startCol);
                      } else {
                          token = this.charToken(c, startLine, startCol);
                      }
                      break;
  
                  /*
                   * Potential tokens:
                   * - DASHMATCH
                   * - INCLUDES
                   * - PREFIXMATCH
                   * - SUFFIXMATCH
                   * - SUBSTRINGMATCH
                   * - CHAR
                   */
                  case "|":
                  case "~":
                  case "^":
                  case "$":
                  case "*":
                      if (reader.peek() === "=") {
                          token = this.comparisonToken(c, startLine, startCol);
                      } else {
                          token = this.charToken(c, startLine, startCol);
                      }
                      break;
  
                  /*
                   * Potential tokens:
                   * - STRING
                   * - INVALID
                   */
                  case "\"":
                  case "'":
                      token = this.stringToken(c, startLine, startCol);
                      break;
  
                  /*
                   * Potential tokens:
                   * - HASH
                   * - CHAR
                   */
                  case "#":
                      if (isNameChar(reader.peek())) {
                          token = this.hashToken(c, startLine, startCol);
                      } else {
                          token = this.charToken(c, startLine, startCol);
                      }
                      break;
  
                  /*
                   * Potential tokens:
                   * - DOT
                   * - NUMBER
                   * - DIMENSION
                   * - PERCENTAGE
                   */
                  case ".":
                      if (isDigit(reader.peek())) {
                          token = this.numberToken(c, startLine, startCol);
                      } else {
                          token = this.charToken(c, startLine, startCol);
                      }
                      break;
  
                  /*
                   * Potential tokens:
                   * - CDC
                   * - MINUS
                   * - NUMBER
                   * - DIMENSION
                   * - PERCENTAGE
                   */
                  case "-":
                      if (reader.peek() === "-") {  //could be closing HTML-style comment
                          token = this.htmlCommentEndToken(c, startLine, startCol);
                      } else if (isNameStart(reader.peek())) {
                          token = this.identOrFunctionToken(c, startLine, startCol);
                      } else {
                          token = this.charToken(c, startLine, startCol);
                      }
                      break;
  
                  /*
                   * Potential tokens:
                   * - IMPORTANT_SYM
                   * - CHAR
                   */
                  case "!":
                      token = this.importantToken(c, startLine, startCol);
                      break;
  
                  /*
                   * Any at-keyword or CHAR
                   */
                  case "@":
                      token = this.atRuleToken(c, startLine, startCol);
                      break;
  
                  /*
                   * Potential tokens:
                   * - NOT
                   * - CHAR
                   */
                  case ":":
                      token = this.notToken(c, startLine, startCol);
                      break;
  
                  /*
                   * Potential tokens:
                   * - CDO
                   * - CHAR
                   */
                  case "<":
                      token = this.htmlCommentStartToken(c, startLine, startCol);
                      break;
  
                  /*
                   * Potential tokens:
                   * - IDENT
                   * - CHAR
                   */
                  case "\\":
                      if (/[^\r\n\f]/.test(reader.peek())) {
                          token = this.identOrFunctionToken(this.readEscape(c, true), startLine, startCol);
                      } else {
                          token = this.charToken(c, startLine, startCol);
                      }
                      break;
  
                  /*
                   * Potential tokens:
                   * - UNICODE_RANGE
                   * - URL
                   * - CHAR
                   */
                  case "U":
                  case "u":
                      if (reader.peek() === "+") {
                          token = this.unicodeRangeToken(c, startLine, startCol);
                          break;
                      }
                      /* falls through */
                  default:
  
                      /*
                       * Potential tokens:
                       * - NUMBER
                       * - DIMENSION
                       * - LENGTH
                       * - FREQ
                       * - TIME
                       * - EMS
                       * - EXS
                       * - ANGLE
                       */
                      if (isDigit(c)) {
                          token = this.numberToken(c, startLine, startCol);
                      } else
  
                      /*
                       * Potential tokens:
                       * - S
                       */
                      if (isWhitespace(c)) {
                          token = this.whitespaceToken(c, startLine, startCol);
                      } else
  
                      /*
                       * Potential tokens:
                       * - IDENT
                       */
                      if (isIdentStart(c)) {
                          token = this.identOrFunctionToken(c, startLine, startCol);
                      } else {
                         /*
                          * Potential tokens:
                          * - CHAR
                          * - PLUS
                          */
                          token = this.charToken(c, startLine, startCol);
                      }
  
              }
  
              //make sure this token is wanted
              //TODO: check channel
              break;
          }
  
          if (!token && c === null) {
              token = this.createToken(Tokens.EOF, null, startLine, startCol);
          }
          
          // ORION Append list of tokens
          if(token.type !== Tokens.S) {
              var smalltoken = Object.create(null);
              smalltoken.type = Tokens.name(token.type);
              smalltoken.value = token.value;
              smalltoken.range = [start, reader.getCursor()];
              this.tokens.push(smalltoken);
          }
  
          return token;
      }