def parse_sexp(sexp_iter):
    """
    Transforms a sequence of s-expression tokens (given in string form) into a corresponding tree of strings.

    The given sequence is interpreted as the elements of an enclosing list expression, i.e.
    with a prepended "(" token and an appended ")" token.

    Example: parse_sexp transforms the sequence ("(", "a", "(", "bc", "d", ")", "1", ")", "5")
    into the structure [["a" ["bc" "d"] "1"], "5"].

    :param sexp_iter: An iterator iterating over the tokens contained in in a s-expression.
    :return: The tree-structure representation of sexp_iter, with s-expression lists being represented
             using Python lists.
    :raises ValueError when sexp_string is malformed.
    """

    results = []

    def __recursively_parse_sexp():
        result = []
        found_expression_end = False
        for token_ in sexp_iter:
            if token_ == ")":
                found_expression_end = True
                break
            elif token_ == "(":
                result.append(__recursively_parse_sexp())
            else:
                result.append(token_)

        if not found_expression_end:
            raise ValueError("Unterminated symbolic expression")
        return result

    for token in sexp_iter:
        if token == "(":
            results.append(__recursively_parse_sexp())
        else:
            results.append(token)

    return results