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=".Count", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateSum(node): return Node("method_call", receiver=node.receiver, message=".Sum()", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateNotContains(node): return Node("unary_op", operator="not", value=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=".Count", args=[], pseudo_type=node.pseudo_type)
[docs]
def translateLenArray(node): return Node("method_call", receiver=node.receiver, message=".Length", args=[], pseudo_type=node.pseudo_type)
[docs]
def translatekeyDict(node): return Node("method_call", receiver=node.receiver, message=".Keys.ToList()", args=[], pseudo_type=node.pseudo_type)
[docs]
def translatevalueDict(node): return Node("method_call", receiver=node.receiver, message=".Values.ToList()", 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 translatePrint(node):
if node.args[0].type=="tuple":
x=[]
for n in node.args[0].elements:
if "value" in dir(n) and n.value in [b'\r', b'\t', b'\n']: continue
x.append(Node(type="ExprStatNode", expr=Node(type="custom_call", function="Console.WriteLine", args=[n])))
return x
else:
return Node(type="ExprStatNode", expr=Node(type="custom_call", function="Console.WriteLine", args=node.args))
[docs]
def translatePow(node):
if node.pseudo_type=="int":
return Node(type="custom_call", function="(int) Math.Pow", args=node.args)
return Node(type="custom_call", function="Math.Pow", args=node.args)
[docs]
def linq(name, z=True, swap=False):
def x(l, f, *args):
pseudo_type, args = args[-1], list(args[:-1])
if args and swap:
f, args[0] = args[0], f
cs = Node(type="method_call",receiver=l, message=name, args=[f] + args,pseudo_type= pseudo_type)
if z:
cs.pseudo_type = 'CSharpEnumerable'
return Node(type="method_call",receiver=cs, message='ToList', args=[], pseudo_type=pseudo_type)
else:
return cs
return x
types_ = {
"int": "int",
"float": "double",
"bool": "bool",
"array": "%s[] %s= new %s",
"list": "List",
"tuple": "Tuple",
"str": "string",
"dict": "Dictionary",
"datetime":"DateTime",
"DateTime":"DateTime"
}
[docs]
def translateCopy(node):
return Node(type="call", function = "new List<%s>"%(types_[node.pseudo_type[1]]), args=[Node("local", name=node.args.name)])
[docs]
class CsharpRules(GeneralRule):
def __init__(self):
GeneralRule.__init__(self)
binary_op = {"and": "&&",
"or": "||",
"not": "!",
"<": "<",
">": ">",
"==": "==",
"+": "+",
"-": "-",
"*": "*",
"/": "/",
">=": ">=",
"<=": "<=",
"!=": "!="
}
unary_op = {
'not': '!',
'+': '+',
'-': '-',
'~': '~'
}
types = {
"int": "int",
"float": "double",
"bool": "bool",
"array": "%s[] %s",
"list": "List",
"tuple": "Tuple",
"str": "string",
"dict": "Dictionary",
"datetime":"DateTime",
"DateTime":"DateTime"
}
functions = {
'math': {
'ln': 'Math.Log',
'log': 'Math.Log',
'tan': 'Math.Tan',
'sin': 'Math.Sin',
'cos': 'Math.Cos',
'asin': 'Math.Asin',
'acos': 'Math.Acos',
'atan': 'Math.Atan',
'sqrt': 'Math.Sqrt',
'ceil': '(int) Math.Ceiling',
'round': 'Math.Round',
'exp': 'Math.Exp',
'pow': 'Math.Pow',
'floor': 'Math.Floor'
},
'io': {
'print': translatePrint,
'read': 'Console.ReadLine',
'read_file': 'File.ReadAllText',
'write_file': 'File.WriteAllText'
},
'system': {
'min': 'Math.Min',
'max': 'Math.Max',
'abs': 'Math.Abs',
'pow': translatePow,
'copy': translateCopy,
"round":"Math.Round"},
'datetime':{
'datetime': ' new DateTime'
}
}
constant = {
'math':{
'pi': 'Math.PI'
}
}
methods = {
'int': {
'float': '(double)'
},
'float': {
'int': '(int)'
},
'str': {
'int': '(int)',
'find': '.IndexOf',
'contains?': '.Contains'
},
'list': {
'len': translateLenList,
'append': '.Add',
'extend': '.AddRange',
'sum': translateSum,
'pop': '.RemoveAt',
'insert_at': ".Insert",
'contains?': '.Contains',
'not contains?': translateNotContains,
'index': '.IndexOf',
'map':lambda node:linq('Select')(node.receiver, node.message, node.args),
"allocate": lambda node: Node(type="assignment",target=node.receiver, value=(Node(type="call", function = "new List<%s>"%(types_[node.pseudo_type[1]]), args=node.args)))
},
'dict': {
'len': translateLenDict,
'keys': translatekeyDict,
'values':translatevalueDict,
"get": translateget
},
'array':{
'len': translateLenArray,
'sum':translateSum,
'append': '.Append',
"allocate": lambda node: Node("assignment", target = node.receiver, value = Node("array", elts = 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;}}
'''
constructor = '''
public %s() { }
'''
copy_constr = '''
public %s(%s toCopy, bool copyAll) // copy constructor
{
if (copyAll)
{
'''
copy_constrList = '''
for (int i = 0; i < toCopy.%s.Count; i++)
{ %s.Add(toCopy.%s[i]); }
'''
copy_constrArray = '''
for (int i = 0; i < %s; i++)
{ %s[i] = toCopy.%s[i]; }
'''
public_properties_compo = '''
{
get
{ return _%s.%s; }
set
{ %s }
}
'''
copy_constr_compo = '''
public %s(%s toCopy): this() // copy constructor
{
'''