class ExpressionParser::Parser

Public Instance Methods

parse(input) click to toggle source
# File lib/expression_parser/parser.rb, line 5
def parse(input)
  @lexer = Lexer.new(input)

  expression_value = expression
  token = @lexer.get_next_token
  if token.kind == Token::End
    expression_value
  else
    case token.kind
    when Token::GThan
      expression_value > expression ? 1 : 0
    when Token::LThan
      expression_value < expression ? 1 : 0
    when Token::Equal
      expression_value == expression ? 1 : 0
    when Token::NotEqual
      expression_value != expression ? 1 : 0
    when Token::GThanE
      expression_value >= expression ? 1 : 0
    when Token::LThanE
      expression_value <= expression ? 1 : 0
    else
      raise 'End expected'
    end
  end
end

Protected Instance Methods

expression() click to toggle source
# File lib/expression_parser/parser.rb, line 33
def expression
  component1 = factor

  additive_operators = [Token::Plus, Token::Minus]

  token = @lexer.get_next_token
  while additive_operators.include?(token.kind)
    component2 = factor

    if token.kind == Token::Plus
      component1 += component2
    else
      component1 -= component2
    end

    token = @lexer.get_next_token
  end
  @lexer.revert

  component1
end
factor() click to toggle source
# File lib/expression_parser/parser.rb, line 55
def factor
  factor1 = number

  multiplicative_operators = [Token::Multiply, Token::Divide, Token::MOD]

  token = @lexer.get_next_token
  while multiplicative_operators.include?(token.kind)
    factor2 = number

    if token.kind == Token::Multiply
      factor1 *= factor2
    elsif token.kind == Token::MOD
      factor1 %= factor2
    else
      factor1 /= factor2
    end

    token = @lexer.get_next_token
  end
  @lexer.revert

  factor1
end
number() click to toggle source
# File lib/expression_parser/parser.rb, line 79
def number
  token = @lexer.get_next_token

  if token.kind == Token::LParen
    value = expression

    expected_rparen = @lexer.get_next_token
    raise 'Unbalanced parenthesis' unless expected_rparen.kind == Token::RParen
  elsif token.kind == Token::Number
    value = token.value
  else
    raise 'Not a number'
  end

  value
end