def negation(self): if self.match('MINUS', 'NOT', 'LN', 'LOG_10', 'SQRT', 'INPUT'): operator = self.tokens[self.c_tok].value self.c_tok += 1 right = self.negation() return Expr.Listed(operator, [right]) else: return self.custom_root()
def factorial(self): expr = self.call() while self.match('BANG'): operator = self.tokens[self.c_tok].value self.c_tok += 1 expr = Expr.Listed(operator, [expr]) return expr
def logbase(self): if self.match('LOG'): operator = self.tokens[self.c_tok].value self.c_tok += 1 base = self.logbase() argument = self.logbase() return Expr.Listed(operator, [base, argument]) else: return self.factorial()
def custom_root(self): expr = self.logbase() while self.match('ROOT'): operator = self.tokens[self.c_tok].value self.c_tok += 1 right = self.logbase() expr = Expr.Listed(operator, [expr, right]) return expr
def comparison(self): expr = self.addition() while self.match('LESS', 'GREATER', 'LESS_EQUAL', 'GREATER_EQUAL'): operator = self.tokens[self.c_tok].value self.c_tok += 1 right = self.addition() expr = Expr.Listed(operator, [expr, right]) return expr
def equality(self): expr = self.comparison() while self.match('BANG_EQUAL', 'EQUAL_EQUAL', 'AND', 'OR'): operator = self.tokens[self.c_tok].value self.c_tok += 1 right = self.comparison() expr = Expr.Listed(operator, [expr, right]) 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 exponentiation(self): stack = [self.negation()] while self.match('CARET'): self.c_tok += 1 stack.append(self.negation()) while len(stack) > 1: right = stack.pop() left = stack.pop() stack.append(Expr.Listed('^', [left, right])) return stack[0]
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)