<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def parse_formula(model_formula, parent_data, unscramble=False):
 """ Recursively parse a model formula by breaking it into additive atoms and tracking grouping symbol depth. Parameters model_formula: str Expression for the model formula, e.g. '(a + b)^^2 + dd1(c + (d + e)^3) + f' Note that any expressions to be expanded *must* be in parentheses, even if they include only a single variable (e.g., (x)^2, not x^2). parent_data: pandas DataFrame A tabulation of all values usable in the model formula. Each additive term in `model_formula` should correspond either to a variable in this data frame or to instructions for operating on a variable (for instance, computing temporal derivatives or exponential terms). Temporal derivative options: * d6(variable) for the 6th temporal derivative * dd6(variable) for all temporal derivatives up to the 6th * d4-6(variable) for the 4th through 6th temporal derivatives * 0 must be included in the temporal derivative range for the original term to be returned when temporal derivatives are computed. Exponential options: * (variable)^6 for the 6th power * (variable)^^6 for all powers up to the 6th * (variable)^4-6 for the 4th through 6th powers * 1 must be included in the powers range for the original term to be returned when exponential terms are computed. Temporal derivatives and exponential terms are computed for all terms in the grouping symbols that they adjoin. Returns ------- variables: list(str) A list of variables included in the model parsed from the provided formula. data: pandas DataFrame All values in the complete model. """

    variables = {}
    data = {}
    expr_delimiter = 0
    grouping_depth = 0
    model_formula = _expand_shorthand(model_formula, parent_data.columns)
    for i, char in enumerate(model_formula):
        if char == '(':
            grouping_depth += 1
        elif char == ')':
            grouping_depth -= 1
        elif grouping_depth == 0 and char == '+':
            expression = model_formula[expr_delimiter:i].strip()
            variables[expression] = None
            data[expression] = None
            expr_delimiter = i + 1
    expression = model_formula[expr_delimiter:].strip()
    variables[expression] = None
    data[expression] = None
    for expression in list(variables):
        if expression[0] == '(' and expression[-1] == ')':
            (variables[expression],
             data[expression]) = parse_formula(expression[1:-1],
                                               parent_data)
        else:
            (variables[expression],
             data[expression]) = parse_expression(expression,
                                                  parent_data)
    variables = list(set(reduce((lambda x, y: x + y), variables.values())))
    data = pd.concat((data.values()), axis=1)

    if unscramble:
        data = _unscramble_regressor_columns(parent_data, data)

    return variables, data