This commit is contained in:
NikolajDanger
2022-06-08 13:08:19 +02:00
parent 2dfbb33213
commit 912c46ab7c
5 changed files with 121 additions and 19 deletions

View File

@@ -23,6 +23,7 @@ def rep_join(l):
return format_string
# TODO: Magnum
def num_to_int(n):
return roman.fromRoman(n)
@@ -31,6 +32,8 @@ def make_string(n):
return n
elif isinstance(n, int):
return roman.toRoman(n)
elif isinstance(n, list):
return f"[{' '.join([make_string(i) for i in n])}]"
else:
raise Exception(n)
@@ -45,6 +48,31 @@ class ExpressionStatement(BaseBox):
self.expression.eval(vtable.copy(), ftable.copy(), modules)
return vtable, ftable
class DataArray(BaseBox):
def __init__(self, content) -> None:
self.content = content
def __repr__(self) -> str:
content_string = rep_join(self.content)
return f"Array([{content_string}])"
def eval(self, vtable, ftable, modules):
content = [i.eval(vtable, ftable, modules) for i in self.content]
return content
class DataRangeArray(BaseBox):
def __init__(self, from_value, to_value) -> None:
self.from_value = from_value
self.to_value = to_value
def __repr__(self) -> str:
content_string = rep_join([self.from_value, self.to_value])
return f"RangeArray([{content_string}])"
def eval(self, vtable, ftable, modules):
content = list(range(self.from_value.eval(), self.to_value.eval()))
return content
class String(BaseBox):
def __init__(self, value) -> None:
self.value = value
@@ -122,7 +150,7 @@ class Defini(BaseBox):
)
return f"Defini({def_string})"
def eval(self, vtable, ftable, modules):
def eval(self, vtable, ftable, _):
ftable[self.name.name] = (
self.parameters, self.statements
)
@@ -180,6 +208,11 @@ class BinOp(BaseBox):
return left + right
case "SYMBOL_MINUS":
return left - right
case "SYMBOL_TIMES":
return left * right
case "SYMBOL_DIVIDE":
# TODO: Fractio
return left // right
case "KEYWORD_MINUS":
return left < right
case "KEYWORD_PLUS":
@@ -242,6 +275,37 @@ class DumStatement(BaseBox):
return vtable, ftable
class PerStatement(BaseBox):
def __init__(self, data_list, variable_name, statements) -> None:
self.data_list = data_list
self.variable_name = variable_name
self.statements = statements
def __repr__(self) -> str:
test = repr(self.data_list)
variable_name = repr(self.variable_name)
statements = f"statements([{rep_join(self.statements)}])"
dum_string = rep_join([test, variable_name, statements])
return f"Per({dum_string})"
def eval(self, vtable, ftable, modules):
data_array = self.data_list.eval(vtable, ftable, modules)
variable_name = self.variable_name.name
for i in data_array:
vtable[variable_name] = i
for statement in self.statements:
vtable, ftable = statement.eval(
vtable, ftable, modules
)
if vtable["ERUMPE"]:
break
if vtable["ERUMPE"]:
vtable["ERUMPE"] = False
break
return vtable, ftable
class Invoca(BaseBox):
def __init__(self, name, parameters) -> None:
self.name = name
@@ -294,6 +358,7 @@ class BuiltIn(BaseBox):
vtable["ERUMPE"] = True
return None
case "FORTIS_NUMERUS":
# TODO: Fors
return random.randint(parameters[0], parameters[1])
case _:
raise Exception(self.builtin)