This commit is contained in:
2024-02-21 16:00:09 +01:00
parent ee2817afbb
commit cee71787f4
11 changed files with 51 additions and 9 deletions

View File

@ -211,6 +211,10 @@ class Statement(BaseBox):
def __repr__(self) -> str:
return f"statement()"
class StatementSkip(Statement):
def __repr__(self) -> str:
return f"skip()"
class StatementSet(Statement):
def __init__(self, expression: Exp, variable: str):
self.expression = expression
@ -316,6 +320,22 @@ class CommandIf(Command):
else:
return vtable, ftable, result
class CommandIfElse(Command):
def __init__(self, statement: Statement, else_statement: Statement, condition):
self.statement = statement
self.else_statement = else_statement
self.condition = condition
def __repr__(self) -> str:
return f"ifelse({self.statement}, {self.condition}, {self.else_statement})"
def eval(self, vtable, ftable):
vtable, ftable, result = self.condition.eval(vtable, ftable)
if result:
return self.statement.eval(vtable, ftable)
else:
return self.else_statement.eval(vtable, ftable)
class CommandBecause(Command):
def __init__(self, statement: Statement, condition):
self.statement = statement

View File

@ -16,7 +16,9 @@ KEYWORD_TOKENS = [("KEYWORD_"+i.upper(), i) for i in [
"variable",
"return",
"argument",
"set"
"set",
"skip",
"else"
]]
BUILTIN_TOKENS = [("BUILTIN", i) for i in [

View File

@ -33,6 +33,10 @@ class Parser():
return [tokens[0]] + tokens[2]
## statement ##
@self.pg.production('statement : KEYWORD_SKIP')
def statement_skip(tokens):
return ast_nodes.StatementSkip()
@self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID')
def statement_set(tokens):
return ast_nodes.StatementSet(tokens[1], tokens[3].value)
@ -70,6 +74,10 @@ class Parser():
def command_if(tokens):
return ast_nodes.CommandIf(tokens[0], tokens[2])
@self.pg.production('command : statement KEYWORD_ELSE statement KEYWORD_IF expression')
def command_ifelse(tokens):
return ast_nodes.CommandIfElse(tokens[0],tokens[2],tokens[4])
@self.pg.production('command : statement KEYWORD_BECAUSE expression')
def command_because(tokens):
return ast_nodes.CommandBecause(tokens[0], tokens[2])