Sha256: 7ac969e2ca4c94c0cb876b32ced5d0af440cd2fc6fa827d26251c4dd0ef1667d

Contents?: true

Size: 1.21 KB

Versions: 8

Compression:

Stored size: 1.21 KB

Contents

require 'dentaku/token'

module Dentaku
  class TokenMatcher
    def initialize(categories=nil, values=nil)
      @categories = [categories].compact.flatten
      @values     = [values].compact.flatten
      @invert     = false

      @min = 1
      @max = 1
    end

    def invert
      @invert = ! @invert
      self
    end

    def ==(token)
      return false if token.nil?
      (category_match(token.category) && value_match(token.value)) ^ @invert
    end

    def match(token_stream, offset=0)
      matched_tokens = []

      while self == token_stream[matched_tokens.length + offset] && matched_tokens.length < @max
        matched_tokens << token_stream[matched_tokens.length + offset]
      end

      if (@min..@max).include? matched_tokens.length
        def matched_tokens.matched?() true end
      else
        def matched_tokens.matched?() false end
      end

      matched_tokens
    end

    def star
      @min = 0
      @max = 1.0/0
      self
    end

    def plus
      @max = 1.0/0
      self
    end

    private

    def category_match(category)
      @categories.empty? || @categories.include?(category)
    end

    def value_match(value)
      @values.empty? || @values.include?(value)
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
dentaku-0.2.10 lib/dentaku/token_matcher.rb
dentaku-0.2.9 lib/dentaku/token_matcher.rb
dentaku-0.2.8 lib/dentaku/token_matcher.rb
dentaku-0.2.7 lib/dentaku/token_matcher.rb
dentaku-0.2.6 lib/dentaku/token_matcher.rb
dentaku-0.2.5 lib/dentaku/token_matcher.rb
dentaku-0.2.4 lib/dentaku/token_matcher.rb
dentaku-0.2.3 lib/dentaku/token_matcher.rb