Source code for pycropml.transpiler.interface

from pycropml.transpiler.pseudo_tree import Node
import copy

[docs]class TreeInterface(): ''' visits recursively nodes of the tree with defined transform_<node_type> methods and transforms in place ''' def __init__(self, tree): self.tree=tree self.ForSequence = False self.nbForSeq=0 self.dependencies=[] self.indexNames=[]
[docs] def transform(self, tree, in_block=False): self.nameIndex=[] if isinstance(tree, Node): if tree.type =="for_sequence": self.ForSequence = True self.nbForSeq =self.nbForSeq+1 if tree.type == "custom_call" and tree.function not in self.dependencies: self.dependencies.append(tree.function) if tree.type=="list" and "list" not in self.dependencies: self.dependencies.append("list") if tree.type=="function_definition": for inp in tree.params: if isinstance(inp.pseudo_type, list): if inp.pseudo_type[0]=="list" and "list" not in self.dependencies: self.dependencies.append("list") if tree.type=="importfrom": self.dependencies.append(tree.name[0]) else: tree = self.transform_default(tree) return tree elif isinstance(tree, list): return [self.transform(child) for child in tree] else: return tree
[docs] def transform_default(self, tree): for field, child in tree.__dict__.items(): if not field.endswith('type'): if isinstance(child, Node): setattr(tree, field, self.transform(child, False)) elif isinstance(child, list) and field == 'block' or field == 'main': setattr(tree, field, self.transform_block(child)) elif isinstance(child, list): setattr(tree, field, self.transform(child)) return tree
[docs] def transform_block(self, tree): results = [] for child in tree: result = self.transform(child, True) if not isinstance(result, list): results.append(result) else: results += result return results
[docs]class middleware(TreeInterface): def __init__(self, tree): TreeInterface.__init__(self, tree)
[docs] def api_translate(self): transformed = self.transform(self) return transformed