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