Class: Walrus::Grammar::ParsletMerge
- Inherits:
-
ParsletSequence
- Object
- ParsletSequence
- Walrus::Grammar::ParsletMerge
- Defined in:
- lib/walrus/grammar/parslet_merge.rb
Instance Method Summary collapse
Instance Method Details
#eql?(other) ⇒ Boolean
69 70 71 72 73 74 75 76 77 |
# File 'lib/walrus/grammar/parslet_merge.rb', line 69 def eql?(other) return false if not other.instance_of? ParsletMerge other_components = other.components return false if @components.length != other_components.length for i in 0..(@components.length - 1) return false unless @components[i].eql? other_components[i] end true end |
#parse(string, options = {}) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/walrus/grammar/parslet_merge.rb', line 16 def parse(string, = {}) raise ArgumentError if string.nil? state = ParserState.new(string, ) last_caught = nil # keep track of the last kind of throw to be caught @components.each do |parseable| catch :ProcessNextComponent do catch :NotPredicateSuccess do catch :AndPredicateSuccess do catch :ZeroWidthParseSuccess do begin parsed = parseable.memoizing_parse(state.remainder, state.) if parsed.respond_to? :each parsed.each { |element| state.parsed(element) } else state.parsed(parsed) end rescue SkippedSubstringException => e state.skipped(e) # rescue ParseError => e # failed, will try to skip; save original error in case skipping fails # if options.has_key?(:skipping_override) : skipping_parslet = options[:skipping_override] # elsif options.has_key?(:skipping) : skipping_parslet = options[:skipping] # else skipping_parslet = nil # end # raise e if skipping_parslet.nil? # no skipper defined, raise original error # begin # parsed = skipping_parslet.memoizing_parse(state.remainder, state.options) # guard against self references (possible infinite recursion) here? # state.skipped(parsed) # redo # skipping succeeded, try to redo # rescue ParseError # raise e # skipping didn't help either, raise original error # end end last_caught = nil throw :ProcessNextComponent # can't use "next" here because it will only break out of innermost "do" end last_caught = :ZeroWidthParseSuccess throw :ProcessNextComponent end last_caught = :AndPredicateSuccess throw :ProcessNextComponent end last_caught = :NotPredicateSuccess end end if state.results.respond_to? :empty? and state.results.empty? and throw last_caught else state.results end end |