Sha256: e1c69c1b8f2c227bfdbf9f4ac89c399f3fa1ad729f68fa0e0a37a9f76596acb2

Contents?: true

Size: 862 Bytes

Versions: 2

Compression:

Stored size: 862 Bytes

Contents

# A sequence of parslets, matched from left to right. Denoted by '>>'
#
# Example: 
#
#   str('a') >> str('b')  # matches 'a', then 'b'
#
class Parslet::Atoms::Sequence < Parslet::Atoms::Base
  attr_reader :parslets
  def initialize(*parslets)
    @parslets = parslets
  end
  
  def >>(parslet)
    @parslets << parslet
    self
  end
  
  def try(io)
    [:sequence]+parslets.map { |p| 
      # Save each parslet as potentially offending (raising an error). 
      @offending_parslet = p
      p.apply(io) 
    }
  rescue Parslet::ParseFailed
    error(io, "Failed to match sequence (#{self.inspect})")
  end
      
  precedence SEQUENCE
  def to_s_inner(prec)
    parslets.map { |p| p.to_s(prec) }.join(' ')
  end

  def error_tree
    Parslet::ErrorTree.new(self).tap { |t|
      t.children << @offending_parslet.error_tree if @offending_parslet }
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
parslet-0.11.0 lib/parslet/atoms/sequence.rb
parslet-0.10.1 lib/parslet/atoms/sequence.rb