def parse_formula(code, extra_operators=[]): if not code.strip(): code = "~ 1" for op in extra_operators: if op.precedence < 0: raise ValueError, "all operators must have precedence >= 0" operators = _default_ops + extra_operators operator_strings = [op.token_type for op in operators] tree = infix_parse(_tokenize_formula(code, operator_strings), operators, _atomic_token_types) if not isinstance(tree, ParseNode) or tree.type != "~": tree = ParseNode("~", None, [tree], tree.origin) return tree
def evaluate_formula(formula): """Given mixed effects formula, return a model description.""" # mixed effects specific operators extra_operators = [Operator('|', 2, 50), Operator('|| ', 2, 50)] # construct a list of operator strings needed for tokenization operators = _default_ops + extra_operators operator_strings = [op.token_type for op in operators] tokens = list(_tokenize_formula(formula, operator_strings)) node = infix_parse(tokens, operators, _atomic_token_types) e = Evaluator() # we can't handle double bar yet e.add_op('|', 2, eval_bar) model_description = e.eval(node, require_evalexpr=False) return model_description
def parse_constraint(string, variable_names): return infix_parse(_tokenize_constraint(string, variable_names), _ops, _atomic)
def _query_from_string(events, string): return _eval(events, infix_parse(_tokenize(string), _ops, _atomic))