Пример #1
0
    def visit_EnhancedForControl(
            self, java_enhanced_for_control: EnhancedForControl):
        for_node = ForNode()
        self.set_coordinate(for_node, java_enhanced_for_control)
        #init
        assign_node = AssignNode()
        variable_node = self.visit(java_enhanced_for_control.var)[0].target
        constant_node = ConstantNode()
        assign_node.target = variable_node
        assign_node.value = constant_node
        for_node.init.append(assign_node)
        #condiction
        operator_node = Operator()
        operator_node.op = '<'
        operator_node.left = variable_node
        operator_node.right = self.visit(java_enhanced_for_control.iterable)
        operator_node.add_children(operator_node.left)
        operator_node.add_children(operator_node.right)
        for_node.term = operator_node
        #update
        update_operator_node = Operator()
        update_const_node = ConstantNode()
        update_const_node.value = 1
        update_operator_node.right = update_const_node
        update_operator_node.left = variable_node
        update_operator_node.op = '+'
        update_assign_node = AssignNode()
        update_assign_node.target = variable_node
        update_assign_node.value = update_operator_node
        for_node.update.append(update_assign_node)

        return for_node
Пример #2
0
    def visit_BoolOp(self, ast_bool_op: BoolOp):
        if type(ast_bool_op.op) == And:
            op = '&&'
        elif type(ast_bool_op.op) == Or:
            op = '||'
        else:
            raise Exception("does not support operator: ", ast_bool_op.op)

        operator_node = Operator()
        operator_node.op = op
        for i, node in enumerate(ast_bool_op.values):
            if i == (len(ast_bool_op.values) - 1) and i > 1:
                right = self.visit(node)
                deep_operator_node.right = right

            elif i == 0:
                left = self.visit(node)
                operator_node.left = left

            else:  #right
                left = self.visit(node)
                deep_operator_node = Operator()
                deep_operator_node.op = op
                deep_operator_node.left = left
                operator_node.right = deep_operator_node

        operator_node.add_children(operator_node.left)
        operator_node.add_children(operator_node.right)
        return operator_node
Пример #3
0
 def visit_Compare(self, ast_compare: Compare):
     operator_node = Operator()
     left = self.visit(ast_compare.left)
     right = self.visit(ast_compare.comparators[0])
     op = self.transform_op(ast_compare.ops[0])
     operator_node.left = left
     operator_node.right = right
     operator_node.op = op
     return operator_node
Пример #4
0
    def visit_BinaryOperation(self, java_op_node: BinaryOperation):
        operator_node = Operator()
        self.set_coordinate(operator_node, java_op_node)

        operator_node.op = java_op_node.operator
        operator_node.left = self.visit(java_op_node.operandl)
        operator_node.right = self.visit(java_op_node.operandr)

        operator_node.add_children(operator_node.left)
        operator_node.add_children(operator_node.right)

        return operator_node
Пример #5
0
    def visit_BinaryOp(self, pyc_bin_op: BinaryOp):
        operator_node = Operator()
        self.set_coordinate(operator_node, pyc_bin_op.coord)
        operator_node.op = pyc_bin_op.op
        operator_node.left = self.visit(pyc_bin_op.left)
        operator_node.right = self.visit(pyc_bin_op.right)

        # need to do some trick at signed variable (-1, +1, -n, +n)
        if hasattr(pyc_bin_op.right, 'value'):
            if pyc_bin_op.left.coord == pyc_bin_op.right.coord:
                if type(pyc_bin_op.left) == Constant and type(pyc_bin_op.right) == Constant:
                    zero = ConstantNode()
                    self.set_coordinate(zero, pyc_bin_op.coord)
                    zero.value = 0

                    operator_node.right = operator_node.left
                    operator_node.left = zero

        operator_node.add_children(operator_node.left)
        operator_node.add_children(operator_node.right)

        return operator_node
Пример #6
0
    def visit_BinOp(self, ast_bin_op: BinOp):
        operator_node = Operator()
        # coord = coordinate(ast_bin_op.col_offset, ast_bin_op.lineno)
        # self.set_coordinate(operator_node, coord)
        if type(ast_bin_op.op) == Add:
            operator_node.op = '+'
        elif type(ast_bin_op.op) == Sub:
            operator_node.op = '-'
        elif type(ast_bin_op.op) == Mult:
            operator_node.op = '*'
        elif type(ast_bin_op.op) == Div:
            operator_node.op = '/'
        elif type(ast_bin_op.op) == FloorDiv:
            operator_node.op = '//'
        elif type(ast_bin_op.op) == Mod:
            operator_node.op = '%'
        elif type(ast_bin_op.op) == Pow:
            operator_node.op = '**'
        elif type(ast_bin_op.op) == LShift:
            operator_node.op = '<<'
        elif type(ast_bin_op.op) == RShift:
            operator_node.op = '>>'
        elif type(ast_bin_op.op) == BitOr:
            operator_node.op = '|'
        elif type(ast_bin_op.op) == BitAnd:
            operator_node.op = '&'
        elif type(ast_bin_op.op) == MatMult:
            operator_node.op = '@'
        else:
            raise Exception("does not support operator: ", ast_bin_op.op)
        operator_node.left = self.visit(ast_bin_op.left)
        operator_node.right = self.visit(ast_bin_op.right)

        operator_node.add_children(operator_node.left)
        operator_node.add_children(operator_node.right)

        return operator_node