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
    compare_expr(token,expression_value,expression)
  end
end

Protected Instance Methods

compare_expr(token,expression_value,expression) click to toggle source
# File lib/expression_parser/parser.rb, line 18
def compare_expr(token,expression_value,expression)
  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
expression() click to toggle source
# File lib/expression_parser/parser.rb, line 37
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 59
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 83
def number
  token = @lexer.get_next_token

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

    expected_rparen = @lexer.get_next_token
    if [Token::GThan,Token::LThan,Token::Equal,Token::NotEqual,Token::GThanE,Token::LThanE].include?(expected_rparen.kind)
      tmp = expression
      value = compare_expr(expected_rparen,value,tmp)
      expected_rparen = @lexer.get_next_token
    end

    expected_rparen
    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