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): def num_to_int(n):
return roman.fromRoman(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): class ExpressionStatement(BaseBox):
def __init__(self, expression) -> None: def __init__(self, expression) -> None:
self.expression = expression self.expression = expression
@@ -114,6 +122,12 @@ class Defini(BaseBox):
) )
return f"Defini({def_string})" 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): class Redi(BaseBox):
def __init__(self, values) -> None: def __init__(self, values) -> None:
self.values = values self.values = values
@@ -122,6 +136,17 @@ class Redi(BaseBox):
values_string = f"[{rep_join(self.values)}]" values_string = f"[{rep_join(self.values)}]"
return f"Redi({values_string})" 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): class Erumpe(BaseBox):
def __repr__(self) -> str: def __repr__(self) -> str:
return "Erumpe()" return "Erumpe()"
@@ -153,10 +178,14 @@ class BinOp(BaseBox):
match self.op: match self.op:
case "SYMBOL_PLUS": case "SYMBOL_PLUS":
return left + right return left + right
case "SYMBOL_MINUS":
return left - right
case "KEYWORD_MINUS": case "KEYWORD_MINUS":
return left < right return left < right
case "KEYWORD_PLUS": case "KEYWORD_PLUS":
return left > right return left > right
case "KEYWORD_EST":
return left == right
case _: case _:
raise Exception(self.op) raise Exception(self.op)
@@ -223,6 +252,22 @@ class Invoca(BaseBox):
invoca_string = rep_join([self.name, parameters_string]) invoca_string = rep_join([self.name, parameters_string])
return f"Invoca({invoca_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): class BuiltIn(BaseBox):
def __init__(self, builtin, parameters) -> None: def __init__(self, builtin, parameters) -> None:
self.builtin = builtin self.builtin = builtin
@@ -243,7 +288,7 @@ class BuiltIn(BaseBox):
case "AUDI_NUMERUS": case "AUDI_NUMERUS":
return num_to_int(input()) return num_to_int(input())
case "DICE": case "DICE":
print(' '.join(parameters)) print(' '.join(make_string(i) for i in parameters))
return None return None
case "ERUMPE": case "ERUMPE":
vtable["ERUMPE"] = True vtable["ERUMPE"] = True

21
main.py
View File

@@ -2,23 +2,18 @@ from lexer import Lexer
from parser import Parser from parser import Parser
text_input = """ text_input = """
VOCA FORS DEFINI fib x UT {
SI x EST NULLUS TUNC {
DESIGNA correct UT FORTIS_NUMERUS I C REDI NULLUS
DESIGNA gvess UT NULLUS } ALUID SI x EST I TUNC {
REDI I
DUM FALSITAS FACE {
DESIGNA gvess UT AUDI_NUMERUS
SI gvess MINUS correct TUNC {
DICE "Too low!"
} ALUID SI gvess PLUS correct TUNC {
DICE "Too high!"
} ALUID { } ALUID {
ERUMPE REDI ((INVOCA fib (x-II)) + (INVOCA fib (x-I)))
} }
} }
DICE "You guessed correctly!" DICE "Input n:"
DICE (INVOCA fib AUDI_NUMERUS)
""" """
lexer = Lexer().get_lexer() lexer = Lexer().get_lexer()