✨
This commit is contained in:
@ -9,11 +9,11 @@ class Parser():
|
||||
[i[0] for i in ALL_TOKENS],
|
||||
precedence=[
|
||||
('left', ["KEYWORD_MAYBE", "KEYWORD_RETURN"]),
|
||||
('left', ["KEYWORD_IF", "KEYWORD_DEFINE", "KEYWORD_AS"]),
|
||||
('left', ["KEYWORD_IF", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]),
|
||||
('left', ["KEYWORD_DO", "BUILTIN"]),
|
||||
('left', ["SYMBOL_EQUALS", "SYMBOL_SET"]),
|
||||
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS"]),
|
||||
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE"])
|
||||
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE", "SYMBOL_LT","SYMBOL_GT"])
|
||||
]
|
||||
)
|
||||
|
||||
@ -49,7 +49,11 @@ class Parser():
|
||||
def statement_if(tokens):
|
||||
return ast_nodes.StatementIf(tokens[0], tokens[2])
|
||||
|
||||
@self.pg.production('statement : KEYWORD_DEFINE ID SYMBOL_LT DATA_NUMERAL SYMBOL_GT KEYWORD_AS statement', precedence="KEYWORD_DEFINE")
|
||||
@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])
|
||||
|
||||
@ -80,9 +84,13 @@ class Parser():
|
||||
return [tokens[0]] + tokens[2]
|
||||
|
||||
## expression ##
|
||||
@self.pg.production('expression : DATA_NUMERAL')
|
||||
def exp_numeral(tokens):
|
||||
return ast_nodes.ExpNumeral(float(tokens[0].value))
|
||||
@self.pg.production('expression : DATA_INT')
|
||||
def exp_int(tokens):
|
||||
return ast_nodes.ExpInt(int(tokens[0].value))
|
||||
|
||||
@self.pg.production('expression : DATA_FLOAT')
|
||||
def exp_int(tokens):
|
||||
return ast_nodes.ExpInt(float(tokens[0].value))
|
||||
|
||||
@self.pg.production('expression : DATA_STRING')
|
||||
def exp_string(tokens):
|
||||
@ -101,6 +109,8 @@ class Parser():
|
||||
@self.pg.production('expression : expression SYMBOL_TIMES expression')
|
||||
@self.pg.production('expression : expression SYMBOL_DIVIDE expression')
|
||||
@self.pg.production('expression : expression SYMBOL_EQUALS expression')
|
||||
@self.pg.production('expression : expression SYMBOL_LT expression')
|
||||
@self.pg.production('expression : expression SYMBOL_GT expression')
|
||||
def exp_a_binop(tokens):
|
||||
return ast_nodes.ExpABinop(tokens[1].value,tokens[0],tokens[2])
|
||||
|
||||
@ -108,10 +118,24 @@ class Parser():
|
||||
def exp_arg(tokens):
|
||||
return ast_nodes.ExpArg(int(tokens[1].value[1:]))
|
||||
|
||||
@self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL')
|
||||
def exp_list(tokens):
|
||||
return ast_nodes.ExpList(tokens[1])
|
||||
|
||||
@self.pg.production('expression : expression SYMBOL_LCURL expression SYMBOL_RCURL')
|
||||
def exp_index(tokens):
|
||||
return ast_nodes.ExpIndex(tokens[0],tokens[2])
|
||||
|
||||
## Error Handling ##
|
||||
@self.pg.error
|
||||
def error_handle(token):
|
||||
raise Exception(token.name, token.value, token.source_pos)
|
||||
if token.source_pos is None:
|
||||
print("E002: No valediction")
|
||||
elif token.source_pos.lineno == 1 and token.source_pos.colno == 1:
|
||||
print("E001: No greeting")
|
||||
else:
|
||||
print(f"E003: Unexpected token '{token.value}' ({token.name}) at line {token.source_pos.lineno}, column {token.source_pos.colno}.")
|
||||
exit()
|
||||
|
||||
## Finish ##
|
||||
parser = self.pg.build()
|
||||
|
Reference in New Issue
Block a user