This commit is contained in:
2024-02-21 15:37:38 +01:00
parent 153216ce63
commit ee2817afbb
11 changed files with 40 additions and 36 deletions

View File

@ -301,7 +301,7 @@ class Call(Statement):
return vtable, ftable, result
class StatementIf(Statement):
class CommandIf(Command):
def __init__(self, statement: Statement, condition):
self.statement = statement
self.condition = condition
@ -316,13 +316,13 @@ class StatementIf(Statement):
else:
return vtable, ftable, result
class StatementBecause(Statement):
class CommandBecause(Command):
def __init__(self, statement: Statement, condition):
self.statement = statement
self.condition = condition
def __repr__(self) -> str:
return f"if({self.statement}, {self.condition})"
return f"because({self.statement}, {self.condition})"
def eval(self, vtable, ftable):
vtable, ftable, result = self.condition.eval(vtable, ftable)
@ -332,7 +332,7 @@ class StatementBecause(Statement):
print("C001: Because assertion incorrect")
exit()
class StatementUntil(Statement):
class CommandUntil(Command):
def __init__(self, statement: Statement, condition):
self.statement = statement
self.condition = condition

View File

@ -36,8 +36,8 @@ SYMBOL_TOKENS = [
("SYMBOL_AND", r"\/\\"),
("SYMBOL_SET", r"\-\>"),
("SYMBOL_TILDE", r"\~"),
# ("SYMBOL_LPARENS", r"\("),
# ("SYMBOL_RPARENS", r"\)"),
("SYMBOL_LPARENS", r"\("),
("SYMBOL_RPARENS", r"\)"),
("SYMBOL_LBRACKET", r"\["),
("SYMBOL_RBRACKET", r"\]"),
("SYMBOL_LCURL", r"\{"),

View File

@ -8,9 +8,9 @@ class Parser():
self.pg = ParserGenerator(
[i[0] for i in ALL_TOKENS],
precedence=[
('left', ["KEYWORD_MAYBE", "KEYWORD_RETURN"]),
('left', ["KEYWORD_IF", "KEYWORD_BECAUSE", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]),
('left', ["KEYWORD_DO", "BUILTIN", "SYMBOL_SET"]),
('left', ["KEYWORD_SET", "SYMBOL_SET", "KEYWORD_IF", "KEYWORD_MAYBE", "KEYWORD_RETURN"]),
('left', [ "KEYWORD_BECAUSE", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]),
('left', ["KEYWORD_DO", "BUILTIN"]),
('left', ["SYMBOL_EQUALS", "SYMBOL_LT","SYMBOL_GT"]),
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS", "SYMBOL_OR", "SYMBOL_AND"]),
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE", "SYMBOL_TILDE"])
@ -33,7 +33,7 @@ class Parser():
return [tokens[0]] + tokens[2]
## statement ##
@self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID', precedence="SYMBOL_SET")
@self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID')
def statement_set(tokens):
return ast_nodes.StatementSet(tokens[1], tokens[3].value)
@ -45,18 +45,6 @@ class Parser():
def statement_maybe(tokens):
return ast_nodes.Maybe(tokens[1])
@self.pg.production('statement : statement KEYWORD_IF expression')
def statement_if(tokens):
return ast_nodes.StatementIf(tokens[0], tokens[2])
@self.pg.production('statement : statement KEYWORD_BECAUSE expression')
def statement_because(tokens):
return ast_nodes.StatementBecause(tokens[0], tokens[2])
@self.pg.production('statement : KEYWORD_UNTIL expression statement')
def statement_until(tokens):
return ast_nodes.StatementUntil(tokens[2],tokens[1])
@self.pg.production('statement : KEYWORD_DEFINE ID SYMBOL_LT DATA_INT SYMBOL_GT KEYWORD_AS statement', precedence="KEYWORD_DEFINE")
def statement_define(tokens):
return ast_nodes.StatementDefine(tokens[1].value, int(tokens[3].value), tokens[6])
@ -78,6 +66,18 @@ class Parser():
def command_call(tokens):
return ast_nodes.Call(tokens[1].value,tokens[4])
@self.pg.production('command : statement KEYWORD_IF expression')
def command_if(tokens):
return ast_nodes.CommandIf(tokens[0], tokens[2])
@self.pg.production('command : statement KEYWORD_BECAUSE expression')
def command_because(tokens):
return ast_nodes.CommandBecause(tokens[0], tokens[2])
@self.pg.production('command : statement KEYWORD_UNTIL expression')
def command_until(tokens):
return ast_nodes.CommandUntil(tokens[0],tokens[2])
## expressions ##
@self.pg.production('expressions : ')
def expressions_none(_):
@ -92,6 +92,10 @@ class Parser():
def exp_int(tokens):
return ast_nodes.ExpInt(int(tokens[0].value))
@self.pg.production('expression : SYMBOL_LPARENS expression SYMBOL_RPARENS')
def exp_paren(tokens):
return tokens[1]
@self.pg.production('expression : DATA_FLOAT')
def exp_float(tokens):
return ast_nodes.ExpInt(float(tokens[0].value))