This commit is contained in:
NikolajDanger
2022-06-07 22:18:55 +02:00
parent de697b121e
commit 2dfbb33213
2 changed files with 54 additions and 14 deletions

View File

@@ -26,6 +26,14 @@ def rep_join(l):
def num_to_int(n):
return roman.fromRoman(n)
def make_string(n):
if isinstance(n, str):
return n
elif isinstance(n, int):
return roman.toRoman(n)
else:
raise Exception(n)
class ExpressionStatement(BaseBox):
def __init__(self, expression) -> None:
self.expression = expression
@@ -114,6 +122,12 @@ class Defini(BaseBox):
)
return f"Defini({def_string})"
def eval(self, vtable, ftable, modules):
ftable[self.name.name] = (
self.parameters, self.statements
)
return vtable, ftable
class Redi(BaseBox):
def __init__(self, values) -> None:
self.values = values
@@ -122,6 +136,17 @@ class Redi(BaseBox):
values_string = f"[{rep_join(self.values)}]"
return f"Redi({values_string})"
def eval(self, vtable, ftable, modules):
values = [
i.eval(vtable.copy(), ftable.copy(), modules)
for i in self.values
]
if len(values) == 1:
vtable["REDI"] = values[0]
else:
vtable["REDI"] = values
return vtable, ftable
class Erumpe(BaseBox):
def __repr__(self) -> str:
return "Erumpe()"
@@ -153,10 +178,14 @@ class BinOp(BaseBox):
match self.op:
case "SYMBOL_PLUS":
return left + right
case "SYMBOL_MINUS":
return left - right
case "KEYWORD_MINUS":
return left < right
case "KEYWORD_PLUS":
return left > right
case "KEYWORD_EST":
return left == right
case _:
raise Exception(self.op)
@@ -223,6 +252,22 @@ class Invoca(BaseBox):
invoca_string = rep_join([self.name, parameters_string])
return f"Invoca({invoca_string})"
def eval(self, vtable, ftable, modules):
parameters = [
i.eval(vtable.copy(), ftable.copy(), modules)
for i in self.parameters
]
vtable_copy = vtable.copy()
function = ftable[self.name.name]
for i, parameter in enumerate(function[0]):
vtable_copy[parameter.name] = parameters[i]
vtable_copy["REDI"] = None
for statement in function[1]:
statement.eval(vtable_copy, ftable, modules)
if vtable_copy["REDI"] is not None:
return vtable_copy["REDI"]
class BuiltIn(BaseBox):
def __init__(self, builtin, parameters) -> None:
self.builtin = builtin
@@ -243,7 +288,7 @@ class BuiltIn(BaseBox):
case "AUDI_NUMERUS":
return num_to_int(input())
case "DICE":
print(' '.join(parameters))
print(' '.join(make_string(i) for i in parameters))
return None
case "ERUMPE":
vtable["ERUMPE"] = True