code: func (s *scanner) scan() (token, string, error) {
  	ch, _, err := s.r.ReadRune()
  
  	if err != nil && err != io.EOF {
  		return tokenError, "", err
  	}
  
  	switch ch {
  	case zeroRune:
  		return eof, "", nil
  	case ':':
  		return colon, string(ch), nil
  	case '~':
  		return tilde, string(ch), nil
  	case '^':
  		return caret, string(ch), nil
  	case '.':
  		return dot, string(ch), nil
  	case '/':
  		return slash, string(ch), nil
  	case '{':
  		return obrace, string(ch), nil
  	case '}':
  		return cbrace, string(ch), nil
  	case '-':
  		return minus, string(ch), nil
  	case '@':
  		return at, string(ch), nil
  	case '\\':
  		return aslash, string(ch), nil
  	case '?':
  		return qmark, string(ch), nil
  	case '*':
  		return asterisk, string(ch), nil
  	case '[':
  		return obracket, string(ch), nil
  	case '!':
  		return emark, string(ch), nil
  	}
  
  	if unicode.IsSpace(ch) {
  		return space, string(ch), nil
  	}
  
  	if unicode.IsControl(ch) {
  		return control, string(ch), nil
  	}
  
  	if unicode.IsLetter(ch) {
  		return tokenizeExpression(ch, word, unicode.IsLetter, s.r)
  	}
  
  	if unicode.IsNumber(ch) {
  		return tokenizeExpression(ch, number, unicode.IsNumber, s.r)
  	}
  
  	return tokenError, string(ch), nil
  }
docs: // Scan extracts tokens and their strings counterpart
  // from the reader