def visit_Assign(self, node): target = node.targets[0] if isinstance(target, ast.Tuple): elts = [self.visit(e) for e in target.elts] value = self.visit(node.value) return "std::tie({0}) = {1};".format(", ".join(elts), value) if isinstance(node.scopes[-1], ast.If): outer_if = node.scopes[-1] if target.id in outer_if.common_vars: value = self.visit(node.value) return "{0} = {1};".format(target.id, value) if isinstance(target, ast.Subscript): target = self.visit(target) value = self.visit(node.value) return "{0} = {1};".format(target, value) definition = node.scopes.find(target.id) if (isinstance(target, ast.Name) and defined_before(definition, node)): target = self.visit(target) value = self.visit(node.value) return "{0} = {1};".format(target, value) elif isinstance(node.value, ast.List): elements = [self.visit(e) for e in node.value.elts] return "{0} {1} {{{2}}};".format(decltype(node), self.visit(target), ", ".join(elements)) else: target = self.visit(target) value = self.visit(node.value) return "auto {0} = {1};".format(target, value)
def visit_List(self, node): if len(node.elts) > 0: elements = [self.visit(e) for e in node.elts] value_type = decltype(node.elts[0]) return "std::vector<{0}>{{{1}}}".format(value_type, ", ".join(elements)) else: raise ValueError("Cannot create vector without elements")
def visit_If(self, node): body_vars = set([v.id for v in node.scopes[-1].body_vars]) orelse_vars = set([v.id for v in node.scopes[-1].orelse_vars]) node.common_vars = body_vars.intersection(orelse_vars) var_definitions = [] for cv in node.common_vars: definition = node.scopes.find(cv) var_type = decltype(definition) var_definitions.append("{0} {1};\n".format(var_type, cv)) if self.visit(node.test) == '__name__ == std::string {"__main__"}': buf = ["int main(int argc, char ** argv) {", "py14::sys::argv = " "std::vector<std::string>(argv, argv + argc);"] buf.extend([self.visit(child) for child in node.body]) buf.append("}") return "\n".join(buf) else: return ("".join(var_definitions) + super(CppTranspiler, self).visit_If(node))