This commit is contained in:
2024-04-12 16:17:58 +02:00
parent 4d4209656d
commit ad9435b12d
7 changed files with 51 additions and 10 deletions

View File

@ -226,6 +226,10 @@ class Builtin(Command):
vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, int(result)
elif self.builtin == "str":
vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, str(result)
else:
raise Exception(f"Unknown builtin {self.builtin}")
@ -298,9 +302,14 @@ class Scope(Statement):
return f"scope([{rep_join(self.statements)}])"
def eval(self, vtable, ftable):
if "#return" in vtable:
del vtable["#return"]
result = None
for statement in self.statements:
# print(statement)
vtable, ftable, _ = statement.eval(vtable, ftable)
# print(statement, vtable)
if "#return" in vtable:
result = vtable["#return"]
break
@ -330,6 +339,7 @@ class Call(Statement):
vtable["#ARGS"] += len(args)
vtable_old, ftable_old = vtable, ftable
vtable, ftable, result = ftable[self.function_name][1].eval(vtable, ftable)
if "#return" in vtable:
@ -337,7 +347,8 @@ class Call(Statement):
vtable["#ARGS"] -= len(args)
return vtable, ftable, result
print(vtable, vtable_old)
return vtable_old, ftable_old, result
class CommandIf(Command):
def __init__(self, statement: Statement, condition):
@ -395,13 +406,15 @@ class CommandUntil(Command):
return f"until({self.statement}, {self.condition})"
def eval(self, vtable, ftable):
if "#return" in vtable:
del vtable["#return"]
while True:
vtable, ftable, result = self.condition.eval(vtable, ftable)
if not result:
vtable, ftable, _ = self.statement.eval(vtable, ftable)
if "#return" in vtable:
result = vtable["#return"]
del vtable["#return"]
return vtable, ftable, result
else:
return vtable, ftable, result

View File

@ -110,7 +110,6 @@ class Parser():
@self.pg.production('expression : DATA_BOOL')
def exp_bool(tokens):
return ast_nodes.ExpBool(tokens[0].value == "true")
@self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL')