class Koota::Parser

Parses Koota patterns.

Public Instance Methods

call(input) click to toggle source
# File lib/koota/parser.rb, line 12
def call(input)
  @input = StringStream.new(input)

  pattern.tap do
    error!("unexpected #{@input.get.inspect}") unless @input.empty?
  end
end

Private Instance Methods

atom() click to toggle source
# File lib/koota/parser.rb, line 46
def atom
  if @input.empty?
    error!('unexpected end of input')
  elsif @input.skip('"')
    [:raw, @input.get_until('"')].tap do
      @input.get # skip the end quote
    end
  elsif (result = @input.get_until('[', ']', '(', ')', '"', '/'))
    [:atom, result]
  else
    error!("unexpected #{@input.get.inspect}")
  end
end
choice() click to toggle source
# File lib/koota/parser.rb, line 38
def choice
  result = [atom].tap do |r|
    r << atom while @input.skip('/')
  end

  result.length == 1 ? result[0] : [:choice, *result]
end
error!(message) click to toggle source
# File lib/koota/parser.rb, line 60
def error!(message)
  raise Error, message
end
group() click to toggle source
# File lib/koota/parser.rb, line 28
def group
  if @input.skip('(')
    [:maybe, pattern].tap { error!('unclosed parenthesis') unless @input.skip(')') }
  elsif @input.skip('[')
    pattern.tap { error!('unclosed brackets') unless @input.skip(']') }
  else
    choice
  end
end
pattern() click to toggle source
# File lib/koota/parser.rb, line 22
def pattern
  [:pattern, group].tap do |result|
    result << group until @input.empty? || @input.match?(')', ']')
  end
end