Ejemplo n.º 1
0
 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()
Ejemplo n.º 2
0
  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
Ejemplo n.º 3
0
 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()
Ejemplo n.º 4
0
  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
Ejemplo n.º 5
0
  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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
  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)
Ejemplo n.º 8
0
  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]
Ejemplo n.º 9
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)