class DParse::Parsers::Seq
Attributes
parsers[R]
Public Class Methods
new(*parsers)
click to toggle source
# File lib/d-parse/parsers/combinators/seq.rb, line 6 def initialize(*parsers) @parsers = parsers end
Public Instance Methods
inspect()
click to toggle source
# File lib/d-parse/parsers/combinators/seq.rb, line 22 def inspect "seq(#{@parsers.map(&:inspect).join(',')})" end
read(input, pos)
click to toggle source
# File lib/d-parse/parsers/combinators/seq.rb, line 10 def read(input, pos) @parsers.reduce(Success.new(input, pos, data: [])) do |res, parser| case res when Success new_res = parser.read(input, res.pos).map { |d| res.data + [d] } with_best_failure(new_res, res) when Failure res end end end
Private Instance Methods
with_best_failure(new_res, res)
click to toggle source
Returns a Success
or Failure
that most accurately describes the failure, meaning the result that has the highest position.
# File lib/d-parse/parsers/combinators/seq.rb, line 30 def with_best_failure(new_res, res) results = [new_res, res] results += [new_res.best_failure] if new_res.is_a?(Success) results += [res.best_failure] if res.is_a?(Success) best_failure = results .select { |r| r.is_a?(DParse::Failure) } .max_by { |r| r.pos.index } case new_res when Success new_res.with_best_failure(best_failure) when Failure best_failure end end