This commit is contained in:
Михаил Капелько
2024-04-04 22:58:40 +03:00
parent 61433596aa
commit 6ef6829fd3
2 changed files with 48 additions and 16 deletions

View File

@@ -1,5 +1,21 @@
from Function import * 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): def translateParameter(s):
# name: type -> type name # name: type -> type name
parts = s.split(": ") parts = s.split(": ")
@@ -9,7 +25,7 @@ def translateParameter(s):
indentation = "".join(" " * indent) indentation = "".join(" " * indent)
return f"{indentation}{t} {name}" return f"{indentation}{t} {name}"
def translateStatement(s): def translateStatement(s, state):
indent = len(s) - len(s.lstrip()) indent = len(s) - len(s.lstrip())
indentation = "".join(" " * indent) indentation = "".join(" " * indent)
ss = s.lstrip() ss = s.lstrip()
@@ -59,8 +75,22 @@ def translateStatement(s):
value = ss[posEqual + len(" = "):] value = ss[posEqual + len(" = "):]
return f"{indentation}auto {name} = {value};" return f"{indentation}auto {name} = {value};"
# Unknown. Return with semicolon at the end. # Keep "if ("
return f"{s};" 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): def translateType(s):
# dict[X, Y] -> std::map<X, Y> # dict[X, Y] -> std::map<X, Y>
@@ -68,6 +98,9 @@ def translateType(s):
kv = s[len("dict["):-len("]")] kv = s[len("dict["):-len("]")]
parts = kv.split(", ") parts = kv.split(", ")
return f"std::map<{parts[0]}, {parts[1]}>" return f"std::map<{parts[0]}, {parts[1]}>"
# str -> std::string
if s == "str":
return "std::string"
# Unknown. Return as is. # Unknown. Return as is.
return s return s
@@ -75,6 +108,7 @@ def translateType(s):
class CPP: class CPP:
def __init__(self, fn): def __init__(self, fn):
self.fn = fn self.fn = fn
self.isIf = False
def translate(self): def translate(self):
returnType = translateType(self.fn.returnType) returnType = translateType(self.fn.returnType)
@@ -85,17 +119,20 @@ class CPP:
p = translateParameter(self.fn.parameters[i]) p = translateParameter(self.fn.parameters[i])
params.append(p) params.append(p)
strparams = "\n".join(params) strparams = "\n".join(params)
if (len(strparams) > 0):
strparams += "\n"
# Statements. # Statements.
sts = [] sts = []
for i in range(0, len(self.fn.statements)): 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) sts.append(s)
strstatements = "\n".join(sts) strstatements = "\n".join(sts)
return f"""{returnType} {self.fn.name}( return f"""{returnType} {self.fn.name}(
{strparams} {strparams}) {{
) {{
{strstatements} {strstatements}
}} }}
""" """

View File

@@ -13,17 +13,12 @@ def process(FILE_IN):
# Parse. # Parse.
for ln in lines_in: for ln in lines_in:
ln = ln.rstrip() ln = ln.rstrip()
# Ignore includes.
if "#include" in ln:
continue
f.parseLine(ln) f.parseLine(ln)
if f.isComplete: if f.isComplete:
print("Function ready!") print("Function ready! Here it is in C++:")
break cpp = CPP(f)
print(cpp.translate())
# Create new function instance.
f = Function()
print(f"Debug: {f}")
cpp = CPP(f)
return cpp.translate()