✨
This commit is contained in:
67
ast_nodes.py
67
ast_nodes.py
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user