From 6ef6829fd39bb174ac693f699aff7b606c94f0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BF?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BA=D0=BE?= Date: Thu, 4 Apr 2024 22:58:40 +0300 Subject: [PATCH] d --- tr-Python-C++/CPP.py | 49 +++++++++++++++++++++++++++++++++++----- tr-Python-C++/process.py | 15 ++++-------- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/tr-Python-C++/CPP.py b/tr-Python-C++/CPP.py index c41c4c8..dfbd595 100644 --- a/tr-Python-C++/CPP.py +++ b/tr-Python-C++/CPP.py @@ -1,5 +1,21 @@ from Function import * +def replaceAnd(s): + return s.replace("and", "&&") + +def replaceLen(s): + posLen = s.find("len(") + posEnd = s.find(")") + if ( + posLen == -1 or + posEnd == -1 + ): + return s + before = s[:posLen] + name = s[posLen + len("len("):posEnd] + after = s[posEnd + len(")"):] + return f"{before}{name}.size(){after}" + def translateParameter(s): # name: type -> type name parts = s.split(": ") @@ -9,7 +25,7 @@ def translateParameter(s): indentation = "".join(" " * indent) return f"{indentation}{t} {name}" -def translateStatement(s): +def translateStatement(s, state): indent = len(s) - len(s.lstrip()) indentation = "".join(" " * indent) ss = s.lstrip() @@ -59,8 +75,22 @@ def translateStatement(s): value = ss[posEqual + len(" = "):] return f"{indentation}auto {name} = {value};" - # Unknown. Return with semicolon at the end. - return f"{s};" + # Keep "if (" + if ss == "if (": + state.isIf = True + return s + + # ): -> } + if ss == "):": + state.isIf = False + return f"{indentation}) {{" + + ending = ";" + if state.isIf: + ending = "" + + # Unknown. + return f"{s}{ending}" def translateType(s): # dict[X, Y] -> std::map @@ -68,6 +98,9 @@ def translateType(s): kv = s[len("dict["):-len("]")] parts = kv.split(", ") return f"std::map<{parts[0]}, {parts[1]}>" + # str -> std::string + if s == "str": + return "std::string" # Unknown. Return as is. return s @@ -75,6 +108,7 @@ def translateType(s): class CPP: def __init__(self, fn): self.fn = fn + self.isIf = False def translate(self): returnType = translateType(self.fn.returnType) @@ -85,17 +119,20 @@ class CPP: p = translateParameter(self.fn.parameters[i]) params.append(p) strparams = "\n".join(params) + if (len(strparams) > 0): + strparams += "\n" # Statements. sts = [] for i in range(0, len(self.fn.statements)): - s = translateStatement(self.fn.statements[i]) + s = translateStatement(self.fn.statements[i], self) + s = replaceAnd(s) + s = replaceLen(s) sts.append(s) strstatements = "\n".join(sts) return f"""{returnType} {self.fn.name}( -{strparams} -) {{ +{strparams}) {{ {strstatements} }} """ diff --git a/tr-Python-C++/process.py b/tr-Python-C++/process.py index 887ecbd..ad626b8 100755 --- a/tr-Python-C++/process.py +++ b/tr-Python-C++/process.py @@ -13,17 +13,12 @@ def process(FILE_IN): # Parse. for ln in lines_in: ln = ln.rstrip() - - # Ignore includes. - if "#include" in ln: - continue - f.parseLine(ln) if f.isComplete: - print("Function ready!") - break + print("Function ready! Here it is in C++:") + cpp = CPP(f) + print(cpp.translate()) + # Create new function instance. + f = Function() - print(f"Debug: {f}") - cpp = CPP(f) - return cpp.translate()