# coding: utf8
from pycropml.transpiler.pseudo_tree import Node
from pycropml.transpiler.antlr_py.api_declarations import Middleware
[docs]
class Declarations(Middleware):
def __init__(self, declarations=[], kvnames={}, all_decl={}):
self.declarations = declarations
self.kvnames = kvnames
self.all_decl = all_decl
self.declnames = []
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_declaration(self, tree):
res = []
for decl in tree.decl:
test =False
if "value" in dir(decl) and decl.value.type == "custom_call" and decl.value.function == "getValue" and decl.value.instance.name in self.all_decl:
self.kvnames[decl.name] = decl.value.instance.name
elif not hasattr(decl, "value") and not hasattr(decl, "init"):
newdecl = decl
if decl.type == "array" and "elts" in dir(decl):
for el in decl.elts:
if "name" in dir(el) and el.name in self.declnames:
test = True
break
if test:
newdecl = Node(type = "array", name=decl.name, dim= len(decl.elts), elts = [], pseudo_type=decl.pseudo_type)
tree = Node(type = 'ExprStatNode',
expr = Node(type = 'standard_method_call',
receiver = Node(type = 'local',
name = newdecl.name,
pseudo_type = newdecl.pseudo_type,
),
message = 'allocate',
args = decl.elts,
pseudo_type = "Void"),
comments = tree.comments)
res.append(self.transform_default(tree))
#del decl.value
self.declarations.append(Node(type="declaration", decl=[newdecl], comments=tree.comments))
self.declnames.append(decl.name)
else:
if hasattr(decl, "value"):
tree = Node(type ="assignment", target = Node(type="local", name=decl.name, pseudo_type=decl.pseudo_type), op = "=", value = decl.value, comments = tree.comments)
del decl.value
elif hasattr(decl, "init"):
z = Node(type="array", init=decl.init)
tree = Node(type ="assignment", target = Node(type="local", name=decl.name, pseudo_type=decl.pseudo_type), op = "=", value = z, comments = tree.comments)
del decl.init
self.declarations.append(Node(type="declaration", decl=[decl], comments = []))
self.declnames.append(decl.name)
res.append(self.transform_default(tree))
return res
[docs]
class Custom_call(Middleware):
def __init__(self, kvnames):
self.kvnames = kvnames
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_custom_call(self, tree):
if tree.function != "setDefaultValue":
if tree.function == "getValue":
tree = tree.instance
tree.pseudo_type = tree.pseudo_type[-1]
elif tree.function == "setValue":
if "name" in dir(tree.args[0]) and tree.args[0].name in self.kvnames and self.kvnames[tree.args[0].name] == tree.instance.name:
return None
else:
tree = Node(type="assignment", op="=", target=tree.instance, value=tree.args[0], comments = tree.comments)
elif tree.function == "setArrayValue":
tree = Node(type="assignment",
op="=",
target = Node(type ='index',
sequence = tree.instance,
index = [tree.args[0]],
pseudo_type = tree.instance.pseudo_type[-1]),
value = tree.args[1],
comments = tree.comments
)
return self.transform_default(tree)
else:
pass
[docs]
class Local(Middleware):
def __init__(self, kvnames):
self.kvnames = kvnames
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_local(self, tree):
tree = tree.name if isinstance(tree.name, Node) else tree
if tree.name in self.kvnames.keys():
tree = Node(type="local", name=self.kvnames[tree.name], pseudo_type = tree.pseudo_type, comments=tree.comments)
return self.transform_default(tree)
[docs]
class MemberAcess(Middleware):
def __init__(self):
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_member_access(self, tree):
if isinstance(tree.name, Node):
name = tree.name
if isinstance(tree.member, list) and len(tree.member)==1 and tree.member[0]=="length":
tree = Node(type="standard_method_call",receiver = name, message="len", args = [], pseudo_type="int", comments=tree.comments )
return self.transform_default(tree)
[docs]
class Assignment(Middleware):
def __init__(self):
Middleware.__init__(self)
[docs]
def process(self, tree):
return self.transform(tree,in_block=False)
[docs]
def action_assignment(self, tree):
if tree.value.type == "RefTypeCasting" \
and tree.value.message[0]=="FWSimVariable" \
and tree.value.receiver.type== "custom_call" \
and tree.value.receiver.function == "getVariable":
pass
elif tree.value.type == "RefTypeCasting" \
and tree.value.message=="Integer" \
and tree.value.receiver.type== "member_access" \
and isinstance(tree.value.receiver.name, Node) and tree.value.receiver.name.type== "custom_call":
if tree.value.receiver.name.function == "getVariable":
args = tree.value.receiver.name.args[0].attribute
res = Node(type = 'standard_method_call',
receiver = Node(type ="local", name = args, pseudo_type ="todoo"),
args = [],
message = "int",
pseudo_type = "int")
return self.transform_default(res)
else:
print(tree.y, "in java preprocessing")
else:
return self.transform_default(tree)