Source code for pycropml.transpiler.rules.cppRules



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 translateSum(node): return Node("call", function="accumulate", args=[Node("local",name="%s.begin()"%node.receiver.name), Node("local",name="%s.end()"%node.receiver.name), Node("local",name="decltype(%s)::value_type(0)"%node.receiver.name)], 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=".Length", 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="%s.begin()"%(node.receiver.name)),op="+",right= node.args)], pseudo_type=node.pseudo_type)
[docs]def translateInsert(node): return Node("custom_call", receiver=node.receiver, function="%s.insert"%node.receiver.name, args=[Node(type="binary_op",left=Node(type="local",name="%s.begin()"%(node.receiver.name)),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="%s.begin()"%(node.receiver.name)),\
Node(type="local",name="%s.end()"%(node.receiver.name)),\ 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="%s.begin()"%(node.receiver.name)),\
Node(type="local",name="%s.end()"%(node.receiver.name)),\ node.args[0]]), right=Node(type="local",name="%s.begin()"%node.receiver.name))
[docs]def translateMIN(node): args=[] if len(node.args)>=2: for i in range(len(node.args)): if node.args[i].pseudo_type!=node.pseudo_type: node.args[i] = Node(type="call", function=node.pseudo_type,args =node.args[i], pseudo_type=node.pseudo_type ) args.append(node.args[i]) node.type = "call" node.args = args node.function = "min" return node
[docs]class CppRules(GeneralRule): def __init__(self): GeneralRule.__init__(self) binary_op = {"and": "&&", "or": "||", "not": "!", "<": "<", ">": ">", "==": "==", "+": "+", "-": "-", "*": "*", "/": "/", ">=": ">=", "<=": "<=", "!=": "!=" } unary_op = { 'not': '!', '+': '+', '-': '-', '~': '~' } types = { "int": "int", "float": "float", "bool": "bool", "array": "array<%s, %s> ", # "list": "vector", "tuple": "tuple", "str": "string", "dict": "map", "datetime":"string", } functions = { 'math': { 'ln': 'log', 'log': 'log10', 'tan': 'tan', 'sin': 'asin', 'cos': 'cos', 'asin': 'asin', 'acos': 'acos', 'atan': 'atan', 'sqrt': 'sqrt', 'ceil': '(int) ceil', 'round': 'round', 'exp': 'exp', 'pow': 'pow' }, 'io': { 'print': "cout<<", 'read': 'Console.ReadLine', 'read_file': 'File.ReadAllText', 'write_file': 'File.WriteAllText' }, 'system': { 'min': translateMIN, 'max': 'max', 'abs': 'abs', 'pow': 'pow'}, 'datetime':{ 'datetime': ' new DateTime' } } 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 }, 'dict': { 'len': translateLenDict, 'keys': translatekeyDict, "get": translateget }, 'array':{ 'len': translateLenArray, 'append': '.Add' } } public_properties = ''' { get { return this._%s; } set { this._%s= value; } }''' public_properties_wrap = '''{ get { return %s.%s;}} ''' constructor = ''' %s::%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 = ''' void %s(%s& toCopy): this() // copy constructor { '''