This commit is contained in:
NikolajDanger
2022-06-08 13:08:19 +02:00
parent 2dfbb33213
commit 912c46ab7c
5 changed files with 121 additions and 19 deletions

View File

@@ -1,3 +1,4 @@
from multiprocessing.dummy import Array
from rply import ParserGenerator
from lexer import all_tokens
@@ -7,7 +8,13 @@ ALL_TOKENS = list(set([i[0] for i in all_tokens]))
class Parser():
def __init__(self):
self.pg = ParserGenerator(ALL_TOKENS)
self.pg = ParserGenerator(
ALL_TOKENS,
precedence=[
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS"]),
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE"])
]
)
def parse(self):
@self.pg.production('program : opt_newline module_calls statements')
@@ -94,6 +101,8 @@ class Parser():
@self.pg.production('expression : expression SYMBOL_MINUS expression')
@self.pg.production('expression : expression SYMBOL_PLUS expression')
@self.pg.production('expression : expression SYMBOL_TIMES expression')
@self.pg.production('expression : expression SYMBOL_DIVIDE expression')
@self.pg.production('expression : expression KEYWORD_EST expression')
@self.pg.production('expression : expression KEYWORD_MINUS expression')
@self.pg.production('expression : expression KEYWORD_PLUS expression')
@@ -116,8 +125,10 @@ class Parser():
def si_statement(tokens):
return tokens[0]
@self.pg.production('statement : per_statement')
@self.pg.production('statement : dum_statement')
def dum_statement(tokens):
@self.pg.production('statement : donicum_statement')
def loops(tokens):
return tokens[0]
@self.pg.production('statement : KEYWORD_ERUMPE')
@@ -132,6 +143,15 @@ class Parser():
def dum(tokens):
return ast_nodes.DumStatement(tokens[1], tokens[5])
@self.pg.production('per_statement : KEYWORD_PER id KEYWORD_IN expression KEYWORD_FACE SYMBOL_LCURL opt_newline statements opt_newline SYMBOL_RCURL')
def per(tokens):
return ast_nodes.PerStatement(tokens[3], tokens[1], tokens[7])
@self.pg.production('donicum_statement : KEYWORD_DONICUM id KEYWORD_UT expression KEYWORD_USQUE expression KEYWORD_FACE SYMBOL_LCURL opt_newline statements opt_newline SYMBOL_RCURL')
def donicum(tokens):
range_array = ast_nodes.DataRangeArray(tokens[3], tokens[5])
return ast_nodes.PerStatement(range_array, tokens[1], tokens[9])
@self.pg.production('aluid_statement : ')
def aluid_empty(_):
return None
@@ -148,6 +168,14 @@ class Parser():
def parens(tokens):
return tokens[1]
@self.pg.production('expression : SYMBOL_LBRACKET expressions SYMBOL_RBRACKET')
def array(tokens):
return ast_nodes.DataArray(tokens[1])
@self.pg.production('expression : SYMBOL_LBRACKET expression KEYWORD_USQUE expression SYMBOL_RBRACKET')
def range_array(tokens):
return ast_nodes.DataRangeArray(tokens[1], tokens[3])
@self.pg.error
def error_handle(token):
raise ValueError(token)