class MtgSearchParser::Lexer
Public Instance Methods
blank?(letter)
click to toggle source
# File lib/mtg_search_parser/lexer.rb, line 63 def blank?(letter) letter =~ /^\s*$/ end
complete_node(letters)
click to toggle source
# File lib/mtg_search_parser/lexer.rb, line 67 def complete_node(letters) case letters.downcase when 'and' Nodes::And.new when 'or' Nodes::Or.new when 'not' Nodes::Not.new else Nodes::Query.new(letters) end end
lex(string)
click to toggle source
# File lib/mtg_search_parser/lexer.rb, line 3 def lex(string) state = :blank current_letters = "" completed_tokens = [] string.each_char do |letter| case state when :blank if !blank?(letter) case letter when '(' completed_tokens << Nodes::LeftParen.new when ')' completed_tokens << Nodes::RightParen.new when '-' completed_tokens << Nodes::Not.new else current_letters << letter if letter == '"' state = :quoted_term elsif letter == '!' state = :exact_name else state = :term end end end when :exact_name current_letters << letter when :quoted_term current_letters << letter if letter == '"' completed_tokens << Nodes::Query.new(current_letters) state = :blank current_letters = "" end when :term case letter when '"' current_letters << letter state = :quoted_term when /^\s*$/ completed_tokens << complete_node(current_letters) state = :blank current_letters = "" when ')' completed_tokens << complete_node(current_letters) << Nodes::RightParen.new state = :blank current_letters = "" else current_letters << letter end end end completed_tokens << Nodes::Query.new(current_letters) completed_tokens.reject(&:blank?) end