Research portable Memory game | Исследовать портируемую игру Память
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

160 líneas
3.9KB

  1. from Function import *
  2. def includes():
  3. return """#include <map>
  4. #include <string>
  5. #include <vector>
  6. #include "memory_Context.h"
  7. """
  8. def replaceAnd(s):
  9. return s.replace("and", "&&")
  10. def replaceComment(s):
  11. return s.replace("#", "//")
  12. def replaceLen(s):
  13. posLen = s.find("len(")
  14. posEnd = s.find(")")
  15. if (
  16. posLen == -1 or
  17. posEnd == -1
  18. ):
  19. return s
  20. before = s[:posLen]
  21. name = s[posLen + len("len("):posEnd]
  22. after = s[posEnd + len(")"):]
  23. return f"{before}{name}.size(){after}"
  24. def translateParameter(s):
  25. # name: type -> type name
  26. parts = s.split(": ")
  27. indent = len(s) - len(s.lstrip())
  28. name = parts[0].lstrip()
  29. t = translateType(parts[1])
  30. indentation = "".join(" " * indent)
  31. return f"{indentation}{t} {name}"
  32. def translateStatement(s, state):
  33. indent = len(s) - len(s.lstrip())
  34. indentation = "".join(" " * indent)
  35. ss = s.lstrip()
  36. posColon = ss.find(": ")
  37. posComma = ss.find(", ")
  38. posCtx = ss.find("c.")
  39. posEqual = ss.find(" = ")
  40. posFor = ss.find("for ")
  41. posIn = ss.find(" in ")
  42. posRange = ss.find("range(")
  43. posRangeEnd = ss.find("):")
  44. posClosingScope = ss.find("#}")
  45. posOpenSquareBracket = ss.find("[")
  46. # #} -> }
  47. if posClosingScope != -1:
  48. return f"{indentation}}}"
  49. # for name in range(x, y): -> for (auto name = x; name < y; ++name) {
  50. if (
  51. posFor >= 0 and
  52. posIn >= 0 and
  53. posRange >= 0
  54. ):
  55. name = ss[posFor + len("for "):posIn]
  56. x = ss[posRange + len("range("):posComma]
  57. y = ss[posComma + len(", "):posRangeEnd]
  58. return f"{indentation}for (auto {name} = {x}; {name} < {y}; ++{name}) {{"
  59. # name: type = value -> type name = value
  60. if (
  61. posColon >= 0 and
  62. posEqual >= 0
  63. ):
  64. name = ss[:posColon]
  65. type = ss[posColon + len(": "):posEqual]
  66. t = translateType(type)
  67. value = ss[posEqual + len(" = "):]
  68. return f"{indentation}{t} {name} = {value};"
  69. # name = value -> auto name = value
  70. if (
  71. posCtx == -1 and
  72. posColon == -1 and
  73. posOpenSquareBracket == -1 and
  74. posEqual >= 0
  75. ):
  76. name = ss[:posEqual]
  77. value = ss[posEqual + len(" = "):]
  78. return f"{indentation}auto {name} = {value};"
  79. # Keep "if ("
  80. if ss == "if (":
  81. state.isIf = True
  82. return s
  83. # Keep "if not ("
  84. if ss == "if not (":
  85. state.isIf = True
  86. return f"{indentation}if !("
  87. # ): -> }
  88. if ss == "):":
  89. state.isIf = False
  90. return f"{indentation}) {{"
  91. ending = ";"
  92. if state.isIf:
  93. ending = ""
  94. # Unknown.
  95. return f"{s}{ending}"
  96. def translateType(s):
  97. # dict[X, Y] -> std::map<X, Y>
  98. if s.startswith("dict["):
  99. kv = s[len("dict["):-len("]")]
  100. parts = kv.split(", ")
  101. return f"std::map<{parts[0]}, {parts[1]}>"
  102. # str -> std::string
  103. if s == "str":
  104. return "std::string"
  105. # Unknown. Return as is.
  106. return s
  107. class CPP:
  108. def __init__(self, fn):
  109. self.fn = fn
  110. self.isIf = False
  111. def translate(self):
  112. returnType = translateType(self.fn.returnType)
  113. # Parameters.
  114. params = []
  115. for i in range(0, len(self.fn.parameters)):
  116. p = translateParameter(self.fn.parameters[i])
  117. # Make Context passed by reference.
  118. #if "Context" in p:
  119. # p = p.replace("Context", "Context&")
  120. params.append(p)
  121. strparams = "\n".join(params)
  122. if (len(strparams) > 0):
  123. strparams += "\n"
  124. # Statements.
  125. sts = []
  126. for i in range(0, len(self.fn.statements)):
  127. s = translateStatement(self.fn.statements[i], self)
  128. s = replaceAnd(s)
  129. s = replaceLen(s)
  130. sts.append(s)
  131. strstatements = "\n".join(sts)
  132. return f"""{returnType} {self.fn.name}(
  133. {strparams}) {{
  134. {strstatements}
  135. }}
  136. """