class Parslet::Source

Wraps the input string for parslet.

Public Class Methods

new(str) click to toggle source
# File lib/parslet/source.rb, line 12
def initialize(str)
  raise(
    ArgumentError, 
    "Must construct Source with a string like object."
  ) unless str.respond_to?(:to_str)

  @str = StringScanner.new(str)

  # maps 1 => /./m, 2 => /../m, etc...
  @re_cache = Hash.new { |h,k| 
    h[k] = /(.|$){#{k}}/ }

  @line_cache = LineCache.new
  @line_cache.scan_for_line_endings(0, str)
end

Public Instance Methods

bytepos() click to toggle source
# File lib/parslet/source.rb, line 77
def bytepos
  @str.pos
end
bytepos=(n) click to toggle source

@note Please be aware of encodings at this point.

# File lib/parslet/source.rb, line 83
def bytepos=(n)
  @str.pos = n
rescue RangeError
end
chars_left() click to toggle source

Returns how many chars remain in the input.

# File lib/parslet/source.rb, line 54
def chars_left
  @str.rest_size
end
chars_until(str) click to toggle source

Returns how many chars there are between current position and the string given. If the string given doesn’t occur in the source, then the remaining chars (chars_left) are returned.

@return [Fixnum] count of chars until str or chars_left

# File lib/parslet/source.rb, line 64
def chars_until str
  slice_str = @str.check_until(Regexp.new(Regexp.escape(str)))
  return chars_left unless slice_str
  return slice_str.size - str.size
end
consume(n) click to toggle source

Consumes n characters from the input, returning them as a slice of the input.

# File lib/parslet/source.rb, line 41
def consume(n)
  position = self.pos
  slice_str = @str.scan(@re_cache[n])
  slice = Parslet::Slice.new(
    position, 
    slice_str,
    @line_cache)

  return slice
end
line_and_column(position=nil) click to toggle source

Returns a <line, column> tuple for the given position. If no position is given, line/column information is returned for the current position given by pos.

# File lib/parslet/source.rb, line 92
def line_and_column(position=nil)
  @line_cache.line_and_column(position || self.bytepos)
end
match(pattern) click to toggle source
Alias for: matches?
matches?(pattern) click to toggle source

Checks if the given pattern matches at the current input position.

@param pattern [Regexp] pattern to check for @return [Boolean] true if the pattern matches at pos

# File lib/parslet/source.rb, line 33
def matches?(pattern)
  @str.match?(pattern)
end
Also aliased as: match
pos() click to toggle source

Position of the parse as a character offset into the original string.

@note Please be aware of encodings at this point.

# File lib/parslet/source.rb, line 74
def pos
  Position.new(@str.string, @str.pos)
end