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}}/m }

  @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)
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