def error_exp(): def process(parsed): (((_, _), var), _) = parsed return ErrorExpr(var) return keyword('ERROR') + keyword('(') + \ Lazy(aexp) + \ keyword(")") ^ process
def len_exp(): def process(parsed): (((_, _), var), _) = parsed return LenExpr(var) return keyword('LEN') + keyword('(') + \ Lazy(aexp) + \ keyword(")") ^ process
def if_stmt(): def process(parsed): (((((_, condition), _), true_stmt), false_parsed), _) = parsed if false_parsed: (_, false_stmt) = false_parsed else: false_stmt = None return IfStatement(condition, true_stmt, false_stmt) return keyword('IF') + keyword('(') + bexp() + keyword(';') + both() + Opt( keyword(';') + both()) + keyword(')') ^ process
def split_extract_exp(): def process(parsed): (((((((_, _), value), _), separator), _), segment), _) = parsed return SplitExtractExpr(value, separator, segment) return keyword('SPLIT') + keyword('(') + \ Lazy(aexp) + \ keyword(',') + \ Lazy(aexp) + \ keyword(',') + \ Lazy(aexp) + \ keyword(')') ^ process
def concat_exp(): def process(parsed): (((((((((_, _), string_1)), _), string_2), _), string_3), _)) = parsed return ConcatExpr(string_1, string_2, string_3) return keyword('CONCAT') + keyword('(') + \ Lazy(aexp) + \ keyword(',') + \ Lazy(aexp) + \ keyword(',') + \ Lazy(aexp) + \ keyword(')') ^ process
def slice_exp(): def process(parsed): (((((((((_, _), var)), _), start), _), end), _)) = parsed return SliceExpr(var, start, end) return keyword('SLICE') + keyword('(') + \ Lazy(aexp) + \ keyword(',') + \ (num_int ^ (lambda i: IntAexp(i))) + \ keyword(',') + \ (num_int ^ (lambda i: IntAexp(i))) + \ keyword(')') ^ process
def orm_count_if_exp(): def process(parsed): (((((((((((((((((_, _), model), _), manager), _), var_name_search), _), var_value_search), _), var_name), _), var_value), _), signo), _), json_field_name), _) = parsed return CountIfExpr(model, manager, var_name_search, var_value_search, var_name, var_value, signo, json_field_name) return keyword('countif') + keyword('(') + \ option() + keyword(',') + option() + keyword(',') + option() + \ keyword(',') + option() + keyword(',') + option() + keyword(',') + option() + keyword(',') + \ option() + keyword(',') + option() + keyword(')') ^ process
def orm_sum_if_exp(): def process(parsed): (((((((((((((((((((_, _), model), _), manager), _), signo), _), var_name), _), var_value), _), var_name_search), _), var_value_search), _), var_result), _), json_field_name), _) = parsed return SumIfExpr(model, manager, signo, var_name, var_value, var_name_search, var_value_search, var_result, json_field_name) return keyword('sumif') + keyword('(') + \ option() + keyword(',') + option() + keyword(',') + option() + keyword(',') + option() + keyword(',') + \ option() + keyword(',') + option() + keyword(',') + \ (num_int ^ (lambda i: IntAexp(i)) | (variable ^ (lambda v: VarAexp(v)))) + keyword(',') + option() + \ keyword(',') + option() + keyword(')') ^ process
def orm_directlink_exp(): def process(parsed): (((((((((((((((_, _), model), _), manager), _), var_name_search), _), var_value_search), _), row), _), var_result), _), json_field_name), _) = parsed return DirectLinkExpr(model, manager, var_name_search, var_value_search, row, var_result, json_field_name) return keyword('directlink') + keyword('(') + \ option() + keyword(',') + option() + keyword(',') + option() + keyword(',') + option() + \ keyword(',') + option() + keyword(',') + option() + keyword(',') + option() + keyword(')') ^ process
def assign_stmt(): def process(parsed): ((name, _), exp) = parsed return AssignStatement(name, exp) return variable + keyword(':=') + (aexp() | if_stmt()) ^ process
def stmt_list(): separator = keyword(':') ^ (lambda x: lambda l, r: CompoundStatement(l, r)) return Exp(stmt(), separator)
def aexp_group(): return keyword('(') + Lazy(aexp) + keyword(')') ^ process_group
def bexp_not(): return keyword('NOT') + Lazy(bexp_term) ^ ( lambda parsed: NotBexp(parsed[1]))
def orm_vlookup_exp(): def process(parsed): (((((((((((((((((((_, _), model), _), manager), _), var_name_search), _), var_value_search), _), signo), _), var_name), _), var_value), _), var_result), _), json_field_name), _) = parsed return VlookupExpr(model, manager, var_name_search, var_value_search, var_name, var_value, signo, var_result, json_field_name) return keyword('vlookup') + keyword('(') + \ option() + keyword(',') + option() + keyword(',') + option() + keyword(',') + option() + \ keyword(',') + option() + keyword(',') + option() + keyword(',') + option() + \ keyword(',') + option() + keyword(',') + option() + keyword(')') ^ process
def any_operator_in_list(ops): op_parsers = [keyword(op) for op in ops] parser = reduce(lambda l, r: l | r, op_parsers) return parser