# coding: utf8
from pycropml.transpiler.pseudo_tree import Node
from pycropml.transpiler.antlr_py.api_declarations import Middleware
from pycropml.transpiler.antlr_py.dssat.dssatExtraction import DssatExtraction
types = ["int", "float", "str", "list", "array", "bool"]
[docs]
class Retrive_from_Comparison(Middleware):
def __init__(self, localvar=[]):
self.localvar = localvar
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_comparison(self, tree):
if tree.left.type == "local" and isinstance(tree.left.pseudo_type, list):
self.var = tree.left
return tree
[docs]
class Declarations(Middleware):
def __init__(self, localvar=[]):
self.localvar = localvar
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_declaration(self, tree):
res = []
if tree.decl[0].type not in types:
return None
for decl in tree.decl:
if decl.name in self.localvar:
res.append(decl)
if res:
tree = Node(type="declaration", decl = res, comments = tree.comments )
else:
return None
return self.transform_default(tree)
"""for decl in tree.decl:
if decl.type not in types:
return None
else:
res.append(decl)
if res:
return Node(type="declaration", decl = res, comments = tree.comments )
else:
return None"""
[docs]
class Call_stmt(Middleware):
def __init__(self, trees=None):
self.trees = trees
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_call_stmt(self, tree):
from copy import copy
extr = DssatExtraction()
comments = copy(tree.comments)
name = tree.name
args = tree.args
subr = extr.getSubroutine(self.trees, name)
otherparams = []
if subr.notdeclared:
imports = subr.imports
res = extr.getDecl(self.trees, imports, subr.notdeclared)
for j in res.values():
j.type="local"
otherparams.append(j)
inputs = [args[n] for n in subr.inputs_pos]
if otherparams: inputs = otherparams + inputs
outputs = [args[n] for n in subr.outputs_pos]
if len(outputs)==1: tree =Node(type="assignment", target = Node(type="local", name=outputs[0].name, pseudo_type=outputs[0].pseudo_type), value = Node(type="custom_call", function=name, args=inputs), comments = comments)
else: tree =Node(type="assignment", target = Node(type="tuple", elements=outputs), value = Node(type="custom_call", function=name, args=inputs), comments = comments)
return self.transform_default(tree)
[docs]
class Assignment(Middleware):
def __init__(self):
Middleware.__init__(self)
self.structfields = dict(list())
self.targets = []
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_assignment(self, tree):
if tree.target.type == "local":
self.targets.append(tree.target.name)
else:
self.targets.append(tree.target.sequence.name)
if tree.value.type == "local" and "name" in dir(tree.target) and tree.target.name == tree.value.name:
return Node(type="comments", comments = tree.comments)
else:
return self.transform_default(tree)
[docs]
class Attr(Middleware):
def __init__(self, trees = None, imports=[]):
Middleware.__init__(self)
self.decls = []
self.trees = trees if trees else None
self.imports = imports
self.attrinstance = {}
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_attr(self, tree):
extr = DssatExtraction()
name = str(tree.name)
pseudo = tree.object.pseudo_type
comments = tree.comments
for mod in self.imports:
modules = extr.getModule(self.trees, mod)
structs = extr.getStruct(modules, pseudo)
decls = extr.getDeclaration(structs, name)
if decls:
if tree.object.name in self.attrinstance:
self.attrinstance[tree.object.name].append(decls.name)
else:self.attrinstance[tree.object.name]=[decls.name]
tree = Node(type = "local", name=str(decls.name), pseudo_type = decls.pseudo_type)
self.decls.append(Node(type="declaration", decl=[decls], comments=comments))
break
return self.transform_default(tree)
[docs]
class Implicit_return(Middleware):
def __init__(self):
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_implicit_return(self, tree):
pass
[docs]
class ModelUnit(Middleware):
def __init__(self):
Middleware.__init__(self)
self.modelunit = []
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_function_definition(self, tree):
if tree.comments and tree.comments[-1]=="!%%ModelUnit%%":
self.modelunit.append(tree)
return self.transform_default(tree)
[docs]
class Local(Middleware):
def __init__(self):
Middleware.__init__(self)
self.localvar = set()
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_local(self, tree):
self.localvar.add(tree.name)
return self.transform_default(tree)