class MtgSearchParser::ParseExecutor

Attributes

parser[R]

Public Class Methods

new() click to toggle source
# File lib/mtg_search_parser.rb, line 48
def initialize
  @parser = MtgSearchParser::Parser.new
end

Public Instance Methods

parse(tokens, max_count = Float::INFINITY) click to toggle source
# File lib/mtg_search_parser.rb, line 52
def parse(tokens, max_count = Float::INFINITY)
  token_count = 0
  parsed = []

  while token = tokens.shift
    token_count += 1

    case token
    when MtgSearchParser::Nodes::RightParen
      break
    when MtgSearchParser::Nodes::LeftParen
      parsed << parse(tokens)
    when MtgSearchParser::Nodes::Query
      parsed << parser.parse(token.contents)
    when MtgSearchParser::Nodes::Or
      parsed << MtgSearchParser::OrGroup.new([parsed.pop] + parse(tokens, 1))
    when MtgSearchParser::Nodes::Not
      parsed << MtgSearchParser::NotGroup.new(parse(tokens, 1))
    else
      parsed << token
    end

    if token_count == max_count
      break
    end
  end

  smart_flatten(parsed)
end

Private Instance Methods

smart_flatten(array) click to toggle source
# File lib/mtg_search_parser.rb, line 84
def smart_flatten(array)
  if array.length == 1 && array.first.is_a?(Array)
    array.first
  else
    array
  end
end