Exemplo n.º 1
0
 def test_conditional(self):
     scope = model.Scope()
     scope["a"] = model.Number(10)
     cond = model.Conditional(
         model.BinaryOperation(model.Number(4), ">", model.Number(3)), [
             model.Assign(
                 "x",
                 model.BinaryOperation(model.Number(3), "-",
                                       model.Number(5))),
             model.Assign(
                 "y",
                 model.BinaryOperation(model.Number(5), "*",
                                       model.Number(5)))
         ], [
             model.Assign(
                 "x",
                 model.BinaryOperation(model.Reference("a"), "*",
                                       model.Number(0)))
         ])
     folder = ConstantFolder()
     tree = folder.visit(cond)
     assert (isinstance(tree, model.Conditional)
             and tree.condition.value > 0
             and isinstance(tree.if_true[0], model.Assign)
             and tree.if_true[0].value.value == -2
             and isinstance(tree.if_true[1], model.Assign)
             and tree.if_true[1].value.value == 25
             and len(tree.if_true) == 2 and len(tree.if_false) == 1
             and isinstance(tree.if_false[0], model.Assign)
             and tree.if_false[0].value.value == 0)
Exemplo n.º 2
0
 def parse_if(self):
     self.ensure_token('if')
     self.ensure_token('(')
     condition = self.parse_expression()
     self.ensure_token(')')
     if_body = self.parse_block()
     else_body = None
     if self.peek_token().value == 'else':
         self.drop_tokens()
         else_body = self.parse_block()
     return model.Conditional(condition, if_body, else_body)
Exemplo n.º 3
0
def mytest():
    printer = PrettyPrinter()
    cond2 = model.Conditional(model.Number(30), [model.Number(10)],
                              [model.Number(20)])
    cond = model.Conditional(
        model.Number(42),
        [model.Number(1), cond2, model.Number(3)],
        [model.Number(4), model.Number(5)])
    cond3 = model.Conditional(model.Number(228), [], [])
    func2 = model.Function(('p111', 'p222'), [
        model.Reference("x"),
        model.Print(model.Reference("p111")),
        model.Read("myVar")
    ])
    fd2 = model.FunctionDefinition("anotherPrettyFunc", func2)
    func = model.Function(
        (),
        [model.UnaryOperation("-", model.Number(100000000)), fd2, cond, cond3])
    fd = model.FunctionDefinition("myPrettyFunc", func)
    printer.visit(fd)
    asd = model.BinaryOperation(
        model.BinaryOperation(model.Number(123), "+", model.Reference("xx")),
        "*",
        model.UnaryOperation(
            "-",
            model.BinaryOperation(model.Reference("xx"), "+",
                                  model.Reference("yy"))))
    printer.visit(asd)
    asd2 = model.BinaryOperation(
        model.BinaryOperation(model.Number(123), "/", model.Reference("xx")),
        "/",
        model.BinaryOperation(
            model.BinaryOperation(model.Reference("xx"), "/",
                                  model.Reference("yy")), "/",
            model.BinaryOperation(model.Number(123), "/",
                                  model.Reference("yy"))))
    printer.visit(asd2)
    printer.visit(model.FunctionCall(model.Reference("func"), [asd, asd2]))
    cond4 = model.Conditional(model.Number(228), [])
    printer.visit(cond4)
Exemplo n.º 4
0
 def test_mixed_conditional(self):
     scope = model.Scope()
     scope["a"] = model.Number(-10)
     scope["b"] = model.Number(5)
     scope["c"] = model.Number(10)
     """ if not (a == c) and b < c:
             print(a) """
     conditional = model.Conditional(
         model.BinaryOperation(
             model.UnaryOperation(
                 "!",
                 model.BinaryOperation(model.Reference("a"), "==",
                                       model.Reference("c"))), "&&",
             model.BinaryOperation(model.Reference("b"), "<",
                                   model.Number(42))),
         [model.Assign("res", model.Reference("a"))])
     printer = PrettyPrinter()
     result = printer.visit(conditional)
     assert (result == "if ((!((a) == (c))) && ((b) < (42))) {\n\tres =" +
             " a;\n};\n")
Exemplo n.º 5
0
def test():
    folder = ConstantFolder()
    prr = printer.PrettyPrinter()
    oper = model.BinaryOperation(
        model.BinaryOperation(
            model.BinaryOperation(
                model.BinaryOperation(model.Number(2), "+", model.Number(3)),
                "/",
                model.BinaryOperation(model.Number(
                    2), "+", model.Reference("x"))
            ),
            "/",
            model.BinaryOperation(
                model.BinaryOperation(model.Reference(
                    "x"), "-", model.Reference("x")),
                "/",
                model.BinaryOperation(model.Reference(
                    "x"), "-", model.Reference("y"))
            )
        ),
        "/",
        model.BinaryOperation(
            model.BinaryOperation(
                model.BinaryOperation(model.Number(
                    0), "*", model.Reference("x")),
                "/",
                model.UnaryOperation("!", model.Reference("x"))
            ),
            "/",
            model.UnaryOperation("-", model.Number(30))
        ),
    )
    opr = model.Conditional(model.UnaryOperation("!", model.Number(2)), [model.Print(model.Number(2))])
    prr.visit(oper)
    prr.visit(opr)
    noper = folder.visit(oper)
    nopr = folder.visit(opr)
    prr.visit(noper)
    prr.visit(nopr)
Exemplo n.º 6
0
def main():
    v = PrettyPrinter()
    v.visit(m.Print(m.Number(10)))
    v.visit(m.UnaryOperation('-', m.Number(10)))
    v.visit(
        m.BinaryOperation(
            m.BinaryOperation(m.Reference('foo'), '+', m.Number(7)), '*',
            m.Number(2)))
    v.visit(m.Read("read"))
    v.visit(
        m.Conditional(
            m.Number(5),
            [m.BinaryOperation(m.Reference('var'), '-', m.Number(-5))]))
    v.visit(
        m.FunctionDefinition(
            'summer',
            m.Function(['a', 'b'], [
                m.Print(
                    m.BinaryOperation(m.Reference('a'), '+',
                                      m.Reference('b'))),
                m.BinaryOperation(m.Reference('a'), '+', m.Reference('b'))
            ])))
    v.visit(
        m.FunctionCall(
            m.Reference('summer'),
            [m.Number(1),
             m.BinaryOperation(m.Number(2), '+', m.Number(3))]))
    v.visit(
        m.Print(
            m.Conditional(m.BinaryOperation(m.Number(4), '-', m.Number(4)), [],
                          [
                              m.BinaryOperation(m.Number(9), '/', m.Number(3)),
                              m.Reference('var')
                          ])))
    v.visit(
        m.FunctionDefinition(
            'abs',
            m.Function(['a', 'b'], [
                m.Conditional(
                    m.BinaryOperation(
                        m.BinaryOperation(m.Reference('a'), '-',
                                          m.Reference('b')), '>', m.Number(0)),
                    [
                        m.Print(
                            m.BinaryOperation(m.Reference('a'), '-',
                                              m.Reference('b')))
                    ], [
                        m.Print(
                            m.BinaryOperation(m.Reference('b'), '-',
                                              m.Reference('a')))
                    ])
            ])))
    v.visit(
        m.FunctionCall(
            m.Reference('abs'),
            [m.Number(23), m.UnaryOperation('-', m.Number(-30))]))
    v.visit(m.FunctionDefinition('fu', m.Function([], [])))
    v.visit(m.FunctionCall(m.Reference('fu'), []))
    v.visit(m.Print(m.BinaryOperation(m.Number(5), '&&', m.Number(6))))
    v.visit(m.Print(m.BinaryOperation(m.Number(3), '<', m.Number(5))))
    v.visit(m.Print(m.Conditional(m.Number(3), None, None)))
    v.visit(m.Print(m.BinaryOperation(m.Number(1), '||', m.Number(4))))
Exemplo n.º 7
0
 def test_empty_conditional(self):
     number = model.Number(42)
     conditional = model.Conditional(number, [], [])
     printer = PrettyPrinter()
     result = printer.visit(conditional)
     assert result == "if (42) {\n};\n"
Exemplo n.º 8
0
 def visit_conditional(self, conditional):
     return m.Conditional(conditional.condition.accept(self),
                          self.optimize_list(conditional.if_true),
                          self.optimize_list(conditional.if_false))
Exemplo n.º 9
0
def test_conditional():
    scope = model.Scope()
    true = model.Number(1)
    false = model.Number(0)
    f = model.FunctionCall(model.Function([], [true]), [])
    cond = model.Conditional(true, None, None)
    cond.evaluate(scope)
    cond = model.Conditional(false, None, None)
    cond.evaluate(scope)
    cond = model.Conditional(true, [], None)
    cond.evaluate(scope)
    cond = model.Conditional(true, None, [])
    cond.evaluate(scope)
    cond = model.Conditional(false, [], None)
    cond.evaluate(scope)
    cond = model.Conditional(false, None, [])
    cond.evaluate(scope)
    cond = model.Conditional(true, [], [])
    cond.evaluate(scope)
    cond = model.Conditional(true, [], [])
    cond.evaluate(scope)
    cond = model.Conditional(true, [true], None)
    assert cond.evaluate(scope) is true
    cond = model.Conditional(false, None, [false])
    assert cond.evaluate(scope) is false
    cond = model.Conditional(true, [f], None)
    assert cond.evaluate(scope) is true
    cond = model.Conditional(false, None, [f])
    assert cond.evaluate(scope) is true
    # If one of the following assertions fail, it means that Conditional has
    # evaluated wrong branch.
    cond = model.Conditional(false, [true], None)
    assert cond.evaluate(scope) is not true
    cond = model.Conditional(false, [true], [])
    assert cond.evaluate(scope) is not true
    cond = model.Conditional(true, None, [false])
    assert cond.evaluate(scope) is not false
    cond = model.Conditional(true, [], [false])
    assert cond.evaluate(scope) is not false
Exemplo n.º 10
0
 def visitConditional(self, extra):
     return model.Conditional(
         extra.condition.visit(self), self.listev(extra.if_true),
         self.listev(extra.if_false)
         if extra.if_false is not None else None)
Exemplo n.º 11
0
 def visit_conditional(self, cond):
     condition = cond.condition.visit(self)
     if_true = self.process_list(cond.if_true or [])
     if_false = self.process_list(cond.if_false or [])
     return model.Conditional(condition, if_true, if_false)