def lex_sexp(sexp_string: str):
    """
    Tokenizes an s-expression string not containing comments.

    Example: lex_sexp transforms the string " 
 	  (a ( bc d) 1)" into the sequence
    ("(", "a", "(", "bc", "d", ")", "1", ")").

    :param sexp_string: An s-expression string that does not contain comments.
    :return: An iterator iterating over the tokens contained in sexp_string.
    """
    cursor = 0
    while cursor != len(sexp_string):
        if sexp_string[cursor].isspace():
            cursor += 1
            continue
        if sexp_string[cursor] == '(':
            yield '('
            cursor += 1
        elif sexp_string[cursor] == ')':
            yield ')'
            cursor += 1
        else:
            cursor_ahead = cursor + 1
            while cursor_ahead != len(sexp_string) and not sexp_string[
                cursor_ahead].isspace() and sexp_string[cursor_ahead
                ] != '(' and sexp_string[cursor_ahead] != ')':
                cursor_ahead += 1
            yield sexp_string[cursor:cursor_ahead]
            cursor = cursor_ahead
