from pycropml.transpiler.rules.generalRule import GeneralRule
from pycropml.transpiler.pseudo_tree import Node
[docs]
def translateLenList(node):
return Node("method_call", receiver=node.receiver, message=".size()", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateLenStr(node):
return Node("method_call", receiver=node.receiver, message=".length()", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateLog(node):
return Node("call", function="std::log10", args=[node.args[0]], pseudo_type=node.pseudo_type)
[docs]
def translateSum(node):
if "name" in dir(node.receiver):
print(node.receiver.y)
return Node("call", function="accumulate",
args=[Node("local", name=f"{node.receiver.name}.begin()"),
Node("local", name=f"{node.receiver.name}.end()"),
Node("int", value="0" if node.receiver.pseudo_type[1] == "int" else "0.0")],
pseudo_type=node.pseudo_type)
[docs]
def translateNotContains(node):
return Node("call", function="!", args=[Node("standard_method_call", receiver=node.receiver,
message="contains?", args=node.args, pseudo_type=node.pseudo_type)])
[docs]
def translateLenDict(node):
return Node("method_call", receiver=node.receiver, message=".size()", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateLenArray(node):
return Node("method_call", receiver=node.receiver, message=".size()", args=[], pseudo_type=node.pseudo_type)
[docs]
def translatekeyDict(node):
return Node("method_call", receiver=node.receiver, message=".Keys", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateget(node):
if "value" in dir(node.args[0]):
return Node('index', sequence=Node('local', name=node.receiver.name,
pseudo_type=node.receiver.pseudo_type),
index=Node(node.args[0].type, value=node.args[0].value, pseudo_type=node.args[0].pseudo_type),
pseudo_type="Void")
elif "name" in dir(node.args[0]):
return Node('index', sequence=Node('local', name=node.receiver.name,
pseudo_type=node.receiver.pseudo_type),
index=Node(node.args[0].type, name=node.args[0].name, pseudo_type=node.args[0].pseudo_type),
pseudo_type="Void")
[docs]
def translatePop(node):
return Node("custom_call", receiver=node.receiver, function="%s.erase" % node.receiver.name, args=[
Node(type="binary_op", left=Node(type="local", name=f"{node.receiver.name}.begin()"), op="+",
right=node.args)], pseudo_type=node.pseudo_type)
[docs]
def translateInsert(node):
return Node("custom_call", receiver=node.receiver, function=f"{node.receiver.name}.insert",
args=[Node(type="binary_op", left=Node(type="local", name=f"{node.receiver.name}.begin()"), op="+",
right=node.args[0]), node.args[1]], pseudo_type=node.pseudo_type)
[docs]
def translateContains(node):
return Node(type="binary_op", op="!=",
left=Node("custom_call", receiver=node.receiver, function="find",
args=[Node(type="local", name=f"{node.receiver.name}.begin()"),
Node(type="local", name=f"{node.receiver.name}.end()"),
node.args[0]]),
right=Node(type="local", name="%s.end()" % node.receiver.name))
[docs]
def translateIndex(node):
return Node(type="binary_op", op="-",
left=Node("custom_call", receiver=node.receiver, function="find",
args=[Node(type="local", name=f"{node.receiver.name}.begin()"),
Node(type="local", name=f"{node.receiver.name}.end()"),
node.args[0]]),
right=Node(type="local", name="%s.begin()" % node.receiver.name))
[docs]
def translate_min_max(node, f):
args = []
if len(node.args) >= 2:
for arg in node.args:
if arg.pseudo_type != node.pseudo_type:
arg = Node(type="call", function=CppRules.types[node.pseudo_type], args=arg,
pseudo_type=node.pseudo_type)
args.append(arg)
node.type = "call"
node.args = args
node.function = f
return node
[docs]
def translateMIN(node):
return translate_min_max(node, "std::min")
[docs]
def translateMAX(node):
return translate_min_max(node, "std::max")
[docs]
class CppRules(GeneralRule):
def __init__(self):
GeneralRule.__init__(self)
binary_op = {"and": "&&",
"or": "||",
"not": "!",
"<": "<",
">": ">",
"==": "==",
"+": "+",
"-": "-",
"*": "*",
"/": "/",
">=": ">=",
"<=": "<=",
"!=": "!="}
unary_op = {
'not': '!',
'+': '+',
'-': '-',
'~': '~'
}
types = {
"int": "int",
"float": "double",
"double": "double",
"bool": "bool",
"array": "std::vector<%s>(%s) ",
"list": "std::vector",
"tuple": "std::tuple",
"str": "std::string",
"dict": "std::map",
"datetime": "std::string",
}
typesCrop = {
"integer": "int",
"double": "double",
"float": "double",
"boolean": "bool",
"array": "std::vector<%s>(%s) ",
"list": "std::vector",
"tuple": "std::tuple",
"string": "std::string",
"dict": "std::map",
"datetime": "std::string",
}
functions = {
'math': {
'ln': 'std::log',
'log': translateLog,
'tan': 'std::tan',
'sin': 'std::sin',
'cos': 'std::cos',
'asin': 'std::asin',
'acos': 'std::acos',
'atan': 'std::atan',
'sqrt': 'std::sqrt',
'ceil': '(int) std::ceil',
'round': 'std::round',
'exp': 'std::exp',
'pow': 'std::pow',
'floor': 'std::floor'
},
'io': {
'print': "std::cout << ",
'read': 'Console.ReadLine',
'read_file': 'File.ReadAllText',
'write_file': 'File.WriteAllText'
},
'system': {
'min': translateMIN,
'max': translateMAX,
'abs': 'std::abs',
'pow': 'std::pow'},
'datetime': {
'datetime': lambda node: Node(type="str", value=argsToStr(node.args))
}
}
constant = {
'math': {
'pi': 'M_PI'
}
}
methods = {
'int': {
'float': 'float'
},
'float': {
'int': 'int'
},
'str': {
'int': 'int',
'find': '.find',
'len': translateLenStr
},
'list': {
'len': translateLenList,
'append': '.push_back',
'sum': translateSum,
'pop': translatePop,
'insert_at': translateInsert,
'contains?': translateContains,
'not contains?': translateNotContains,
'index': translateIndex,
"allocate": lambda node: Node("assignment", target=node.receiver,
value=Node("list", elements=node.args,
pseudo_type=node.receiver.pseudo_type))
},
'dict': {
'len': translateLenDict,
'keys': translatekeyDict,
"get": translateget
},
'array': {
'len': translateLenArray,
'sum': translateSum,
'append': '.Add',
"allocate": lambda node: Node("assignment", target=node.receiver,
value=Node("list", elements=node.args,
pseudo_type=node.receiver.pseudo_type))
}
}
public_properties = '''\
{
get
{
return this._%s;
}
set
{
this._%s= value;
}
}'''
public_properties_wrap = "{ get { return %s.%s;}}\n"
constructor = '''\
%s::%s()
{
}
'''
copy_constr = '''\
public %s(%s toCopy, bool copyAll) // copy constructor
{
if (copyAll)
{
'''
copy_constrList = '''\
for (int i = 0; i < toCopy.get%s().Count; i++)
{
%s.Add(toCopy.get%s()[i]);
}
'''
copy_constrArray = '''\
for (int i = 0; i < %s; i++)
{
%s[i] = toCopy.get%s()[i];
}
'''
public_properties_compo = '''\
{
get
{
return _%s.%s;
}
set
{
%s
}
}
'''
copy_constr_compo = '''\
void %s(%s& toCopy): this() // copy constructor
{
'''
[docs]
def argsToStr(args):
t = []
for arg in args:
t.append(arg.value)
return '/'.join(t)