public Token getNextToken() {
		if (m_characterIterator == null) {
			return ExceptionHandler.getInstance().throwException(Exception.NO_INPUT_STREAM, ExceptionStrength.STRONG);
		} else {
			while (m_characterIterator.hasNext()) {
				if (CharacterUtilities.isWhitespace(m_characterIterator.peek())) {
					m_characterIterator.getNext();
				} else if (CharacterUtilities.isDigit(m_characterIterator.peek())) {
					return getIntegerToken(m_characterIterator.getNext(), m_characterIterator.getIndex());
				} else if (CharacterUtilities.isLetter(m_characterIterator.peek())) {
					return getKeywordOrIdentifierToken(m_characterIterator.getNext(), m_characterIterator.getIndex());
				} else if (startsWithReservedSymbol(m_characterIterator.peek())) {
					Token token = getSymbolToken(m_characterIterator.getNext(), m_characterIterator.getIndex());
					if (isOpeningComment(token)) {
						skipCommentedCode();
						return getNextToken();
					} else if (isClosingComment(token)) {
						return ExceptionHandler.getInstance().throwException(Exception.IMPROPERLY_FORMATTED_COMMENT, ExceptionStrength.STRONG);
					} else {
						return token;
					}
				} else {
					return ExceptionHandler.getInstance().throwException(Exception.INVALID_CHARACTER, ExceptionStrength.STRONG, m_characterIterator.peek(), m_characterIterator.getIndex() + 1);
				}
			}
			return new Token<String>(m_characterIterator.getIndex(), 1, Token.Type.EOF, Token.Type.EOF.toString());
		}
	}