def test_infix(self): actions = [] def infix_action(parser, tokens): actions.append(tokens) return tokens var = Word() def var_action(parser, tokens): actions.extend(tokens) return tokens[0] var.set_action(var_action) hede = Infix(var, Literal("+")) hede.set_action(infix_action) hede.parse_string({}, 'a + b') self.assertEquals(actions, ['a', 'b', ['a', '+', 'b']])
functionmethodcall = (trailerwithcall | trailerwithoutcall | funccall) # TODO should be fixed using postfix or sth trailer = atom + Postfix(Optional(accessor) + Optional( functionmethodcall | getitem )) def trailerwithcall_process(children, parser): index = parser.add_atom("str", children[0][1][0]) parser.add_instruction("pushconst %s" % index) parser.add_instruction("getmethod") return [child.process(child, parser) for child in children[0]] trailerwithcall.process = trailerwithcall_process trailerwithoutcall.set_action(accessor_action) divexpr = Infix(trailer, Literal('/')) divexpr.process = infix_process("div") mulexpr = Infix(divexpr, Literal('*')) mulexpr.process = infix_process("mul") modexpr = Infix(mulexpr, Literal('%')) modexpr.process = infix_process("mod") subexpr = Infix(modexpr, Literal('-')) subexpr.process = infix_process("sub") addexpr = Infix(subexpr, Literal('+')) addexpr.process = infix_process("add") equalsexpr = Infix(addexpr, Literal("==")) equalsexpr.process = infix_process("equals") inexpr = Infix(equalsexpr, Literal("in")) inexpr.process = infix_process("contains", reverse=True) orexpr = Infix(inexpr, Literal('or')) orexpr.process = infix_process("or")