Пример #1
0
  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
Пример #2
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)
Пример #3
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)