public Token nextToken() throws LexicalError
	{
		if ( ! hasInput() ) {
			return null;
		}

		int start = position;

		int state = 0;
		int lastState = 0;
		int endState = -1;
		int end = -1;

		while (hasInput())
		{
			lastState = state;
			state = nextState(nextChar(), state);

			if (state < 0) {
				break;
			} else
			{
				if (tokenForState(state) >= 0)
				{
					endState = state;
					end = position;
				}
			}
		}
		if (endState < 0 || (endState != state && tokenForState(lastState) == -2)) {
			throw new LexicalError(SCANNER_ERROR[lastState], start);
		}

		position = end;

		int token = tokenForState(endState);

		if (token == 0) {
			return nextToken();
		} else
		{
			String lexeme = input.substring(start, end);
			token = lookupToken(token, lexeme);
			return new Token(token, lexeme, start);
		}
	}