Research portable Memory game | Исследовать портируемую игру Память
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

143 rindas
3.5KB

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