Exemple #1
0
    def _visit_Assign(self, stmt):

        lhs = self._visit(stmt.targets)
        if len(lhs) == 1:
            lhs = lhs[0]
        else:
            lhs = PythonTuple(*lhs)

        rhs = self._visit(stmt.value)
        expr = Assign(lhs, rhs)

        # we set the fst to keep track of needed information for errors

        expr.set_fst(stmt)
        return expr
Exemple #2
0
    def _visit_ListComp(self, stmt):

        result = self._visit(stmt.elt)
        generators = list(self._visit(stmt.generators))

        if not isinstance(self._scope[-2], ast.Assign):
            errors.report(PYCCEL_RESTRICTION_LIST_COMPREHENSION_ASSIGN,
                          symbol=stmt,
                          severity='error')
            lhs = self.get_new_variable()
        else:
            lhs = self._visit(self._scope[-2].targets)
            if len(lhs) == 1:
                lhs = lhs[0]
            else:
                raise NotImplementedError(
                    "A list comprehension cannot be unpacked")

        index = self.get_new_variable()

        args = [index]
        target = IndexedBase(lhs)[args]
        target = Assign(target, result)
        assign1 = Assign(index, LiteralInteger(0))
        assign1.set_fst(stmt)
        target.set_fst(stmt)
        generators[-1].insert2body(target)
        assign2 = Assign(index, PyccelAdd(index, LiteralInteger(1)))
        assign2.set_fst(stmt)
        generators[-1].insert2body(assign2)

        indices = [generators[-1].target]
        while len(generators) > 1:
            F = generators.pop()
            generators[-1].insert2body(F)
            indices.append(generators[-1].target)
        indices = indices[::-1]
        return FunctionalFor([assign1, generators[-1]], target.rhs, target.lhs,
                             indices, index)