✨
This commit is contained in:
@ -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
|
||||
|
@ -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 [
|
||||
|
@ -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])
|
||||
|
Reference in New Issue
Block a user