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