private Token nextToken(Token reusableToken) throws IOException {
		assert reusableToken != null;

		//先使用上次留下来的。
		Token nextToken = tokenQueue.poll();
		if(nextToken != null) {
			return nextToken;
		}

		/*//在 TokenUtils.nextToken 已经调用了 inc
		if(!input.incrementToken()) {
			return null;
		}*/

		/*TermAttribute termAtt = (TermAttribute)input.getAttribute(TermAttribute.class);
		OffsetAttribute offsetAtt = (OffsetAttribute)input.getAttribute(OffsetAttribute.class);
		TypeAttribute typeAtt = (TypeAttribute)input.getAttribute(TypeAttribute.class);

		nextToken = reusableToken.reinit(termAtt.termBuffer(), 0, termAtt.termLength(), offsetAtt.startOffset(), offsetAtt.endOffset(), typeAtt.type());*/

		nextToken = TokenUtils.nextToken(input, reusableToken);

		if(nextToken != null &&
				(Word.TYPE_LETTER_OR_DIGIT.equalsIgnoreCase(nextToken.type())
					|| Word.TYPE_DIGIT_OR_LETTER.equalsIgnoreCase(nextToken.type()))
				) {
			final char[] buffer = nextToken.buffer();
			final int length = nextToken.length();
			byte lastType = (byte) Character.getType(buffer[0]);	//与上次的字符是否同类
			int termBufferOffset = 0;
			int termBufferLength = 0;
			for(int i=0;i<length;i++) {
				byte type = (byte) Character.getType(buffer[i]);
				if(type <= Character.MODIFIER_LETTER) {
					type = Character.LOWERCASE_LETTER;
				}
				if(type != lastType) {	//与上一次的不同
					addToken(nextToken, termBufferOffset, termBufferLength, lastType);

					termBufferOffset += termBufferLength;
					termBufferLength = 0;

					lastType = type;
				}

				termBufferLength++;
			}
			if(termBufferLength > 0) {	//最后一次
				addToken(nextToken, termBufferOffset, termBufferLength, lastType);
			}
			nextToken = tokenQueue.poll();
		}

		return nextToken;
	}