def primary(self): expr = None token_value = self.tokens[self.c_tok].value if self.match('ENDLINE'): self.c_tok -= 1 expr = Expr.Literal(None) elif self.match('TRUE'): expr = Expr.Literal(True) elif self.match('FALSE'): expr = Expr.Literal(False) elif self.match('NIL'): expr = Expr.Literal(None) elif self.match('STRING'): expr = Expr.Literal(token_value[1:len(token_value)-1]) elif self.match('NUM'): expr = Expr.Literal(float(token_value)) elif self.match('KIND'): expr = Expr.Literal(token_value) elif self.match('ID'): expr = Expr.Variable(token_value) elif self.match('L_PAREN'): self.c_tok += 1 expr = Expr.Grouping(self.expression()) if not self.match('R_PAREN'): raise Parser.ParserError if not expr: raise Parser.ParserError self.c_tok += 1 return expr
def multiplication(self): expr = self.exponentiation() while self.match('STAR', 'SLASH', 'MOD'): operator = self.tokens[self.c_tok].value self.c_tok += 1 right = self.exponentiation() expr = Expr.Listed(operator, [expr, right]) return expr self.c_tok += 1 return Expr.Literal(self.tokens[self.c_tok - 1].value)
def addition(self): expr = self.multiplication() while self.match('PLUS', 'MINUS'): operator = self.tokens[self.c_tok].value self.c_tok += 1 right = self.multiplication() expr = Expr.Listed(operator, [expr, right]) return expr self.c_tok += 1 return Expr.Literal(self.tokens[self.c_tok - 1].value)