class Quarrel::Parser

Attributes

factory[R]
words[R]

Public Class Methods

new(words, factory) click to toggle source
# File lib/quarrel/parser.rb, line 14
def initialize words, factory
  @words = words
  @factory = factory
end
parse(words, factory) click to toggle source
# File lib/quarrel/parser.rb, line 8
def self.parse words, factory
  new(words, factory).parse
end

Public Instance Methods

parse() click to toggle source
# File lib/quarrel/parser.rb, line 19
def parse
  i = Quarrel::Iterator.new @words
  results = []

  loop do
    word = i.next

    if Quarrel::Duck.symbolic?(word) && name = word[/^([a-z_]\w*)$/, 1]
      results << factory.required(name.to_sym)

    elsif Quarrel::Duck.symbolic?(word) && name = word[/^([a-z_]\w*)\?$/, 1]
      results << factory.optional(name.to_sym)

    elsif Quarrel::Duck.symbolic?(word) && name = word[/^([a-z_]\w*)\=$/, 1]
      raise SyntaxError,
        "Expected default value for :#{name} " +
      "at position #{i.position+1}: #{words.inspect}" unless i.next?

      results << factory.defaulted(name.to_sym, i.next)
    else 
      raise SyntaxError,
        "Expected parameter specification at position #{i.position}, " +
        "got #{word.inspect}: #{words.inspect}"
    end

  end

  results
end