def split_smiles(smiles: str) ->list:
    """Splits a SMILES string into individual tokens.

    This will split a SMILES string into tokens representing
    individual parts of the SMILES string. Each individual token
    will be one of the following,

    - A single atom (including hydrogens or charge if specified)
    - A ring connection number (single digit or multi-digit)
    - Another SMILES character

    Args:
        smiles: The input SMILES string.

    Returns:
        A list of tokens.
    """
    result = []
    while smiles != '':
        if smiles[:2] == 'Cl' or smiles[:2] == 'Br':
            token_length = 2
        elif smiles[0] == '%':
            token_length = 3
        elif smiles[0] == '[':
            token_length = smiles.index(']') + 1
        else:
            token_length = 1
        result.append(smiles[:token_length])
        smiles = smiles[token_length:]
    return result
