Research portable Memory game | Исследовать портируемую игру Память
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

103 строки
2.6KB

  1. from Function import *
  2. def translateParameter(s):
  3. # name: type -> type name
  4. parts = s.split(": ")
  5. indent = len(s) - len(s.lstrip())
  6. name = parts[0].lstrip()
  7. t = translateType(parts[1])
  8. indentation = "".join(" " * indent)
  9. return f"{indentation}{t} {name}"
  10. def translateStatement(s):
  11. indent = len(s) - len(s.lstrip())
  12. indentation = "".join(" " * indent)
  13. ss = s.lstrip()
  14. posColon = ss.find(": ")
  15. posComma = ss.find(", ")
  16. posEqual = ss.find(" = ")
  17. posFor = ss.find("for ")
  18. posIn = ss.find(" in ")
  19. posRange = ss.find("range(")
  20. posRangeEnd = ss.find("):")
  21. posClosingScope = ss.find("#}")
  22. posOpenSquareBracket = ss.find("[")
  23. # #} -> }
  24. if posClosingScope != -1:
  25. return f"{indentation}}}"
  26. # for name in range(x, y): -> for (auto name = x; name < y; ++name) {
  27. if (
  28. posFor >= 0 and
  29. posIn >= 0 and
  30. posRange >= 0
  31. ):
  32. name = ss[posFor + len("for "):posIn]
  33. x = ss[posRange + len("range("):posComma]
  34. y = ss[posComma + len(", "):posRangeEnd]
  35. return f"{indentation}for (auto {name} = {x}; {name} < {y}; ++{name}) {{"
  36. # name: type = value -> type name = value
  37. if (
  38. posColon >= 0 and
  39. posEqual >= 0
  40. ):
  41. name = ss[:posColon]
  42. type = ss[posColon + len(": "):posEqual]
  43. t = translateType(type)
  44. value = ss[posEqual + len(" = "):]
  45. return f"{indentation}{t} {name} = {value};"
  46. # name = value -> auto name = value
  47. if (
  48. posColon == -1 and
  49. posOpenSquareBracket == -1 and
  50. posEqual >= 0
  51. ):
  52. name = ss[:posEqual]
  53. value = ss[posEqual + len(" = "):]
  54. return f"{indentation}auto {name} = {value};"
  55. # Unknown. Return with semicolon at the end.
  56. return f"{s};"
  57. def translateType(s):
  58. # dict[X, Y] -> std::map<X, Y>
  59. if s.startswith("dict["):
  60. kv = s[len("dict["):-len("]")]
  61. parts = kv.split(", ")
  62. return f"std::map<{parts[0]}, {parts[1]}>"
  63. # Unknown. Return as is.
  64. return s
  65. class CPP:
  66. def __init__(self, fn):
  67. self.fn = fn
  68. def translate(self):
  69. returnType = translateType(self.fn.returnType)
  70. # Parameters.
  71. params = []
  72. for i in range(0, len(self.fn.parameters)):
  73. p = translateParameter(self.fn.parameters[i])
  74. params.append(p)
  75. strparams = "\n".join(params)
  76. # Statements.
  77. sts = []
  78. for i in range(0, len(self.fn.statements)):
  79. s = translateStatement(self.fn.statements[i])
  80. sts.append(s)
  81. strstatements = "\n".join(sts)
  82. return f"""{returnType} {self.fn.name}(
  83. {strparams}
  84. ) {{
  85. {strstatements}
  86. }}
  87. """