Class: Parslet::Atoms::Context

### Home Classes Methods

### In Files

- lib/parslet/atoms/context.rb

### Parent

Object

### Methods

- ::new
- #err
- #err_at
- #scope
- #try_with_cache

### Files

- README

### Class/Module Index

Quicksearch

- Parslet
- Parslet::Atoms
- Parslet::Atoms::Alternative
- Parslet::Atoms::Base
- Parslet::Atoms::CanFlatten
- Parslet::Atoms::Capture
- Parslet::Atoms::Context
- Parslet::Atoms::DSL
- Parslet::Atoms::Dynamic
- Parslet::Atoms::Entity
- Parslet::Atoms::Lookahead
- Parslet::Atoms::Named
- Parslet::Atoms::Precedence
- Parslet::Atoms::Re
- Parslet::Atoms::Repetition
- Parslet::Atoms::Scope
- Parslet::Atoms::Sequence
- Parslet::Atoms::Str
- Parslet::Cause
- Parslet::ClassMethods
- Parslet::DelayedMatchConstructor
- Parslet::ErrorReporter
- Parslet::ErrorReporter::Deepest
- Parslet::ErrorReporter::Tree
- Parslet::Expression
- Parslet::Expression::Treetop
- Parslet::Expression::Treetop::Parser
- Parslet::Expression::Treetop::Transform
- Parslet::ParseFailed
- Parslet::Parser
- Parslet::Parser::PrettyPrinter
- Parslet::Parser::Visitors
- Parslet::Parser::Visitors::Citrus
- Parslet::Parser::Visitors::Treetop
- Parslet::Pattern
- Parslet::Pattern::SequenceBind
- Parslet::Pattern::SimpleBind
- Parslet::Pattern::SubtreeBind
- Parslet::Scope
- Parslet::Scope::Binding
- Parslet::Scope::NotFound
- Parslet::Slice
- Parslet::Source
- Parslet::Source::LineCache
- Parslet::Source::RangeSearch
- Parslet::Transform
- Parslet::Transform::Context

No matching classes.

# Parslet::Atoms::Context

Helper class that implements a transient cache that maps position and parslet object to results. This is used for memoization in the packrat style.

Also, error reporter is stored here and error reporting happens through this class. This makes the reporting pluggable.

### Attributes

captures[R]

Returns the current captures made on the input (see Parslet::Atoms::Base#capture). Use as follows:

    context.captures[:foobar] # => returns capture :foobar

### Public Class Methods

new(reporter=Parslet::ErrorReporter::Tree.new) click to toggle source

@param reporter [err, err_at] Error reporter (leave empty for default

    reporter)

    # File lib/parslet/atoms/context.rb, line 12
    def initialize(reporter=Parslet::ErrorReporter::Tree.new)
      @cache = Hash.new { |h, k| h[k] = {} }
      @reporter = reporter
      @captures = Parslet::Scope.new
    end

### Public Instance Methods

err(*args) click to toggle source

Report an error. @see ErrorReporter

    # File lib/parslet/atoms/context.rb, line 61
    def err(*args)
      return [false, @reporter.err(*args)] if @reporter
      return [false, nil]
    end

err_at(*args) click to toggle source

Report an error at a given position. @see ErrorReporter

    # File lib/parslet/atoms/context.rb, line 53
    def err_at(*args)
      return [false, @reporter.err_at(*args)] if @reporter
      return [false, nil]
    end

scope() click to toggle source

Starts a new scope. Use the scope method of Parslet::Atoms::DSL to call this.

    # File lib/parslet/atoms/context.rb, line 76
    def scope
      captures.push
      yield
    ensure
      captures.pop
    end

try_with_cache(obj, source, consume_all) click to toggle source

Caches a parse answer for obj at source.pos. Applying the same parslet at one position of input always yields the same result, unless the input has changed.

We need the entire source here so we can ask for how many characters were consumed by a successful parse. Imitation of such a parse must advance the input pos by the same amount of bytes.

    # File lib/parslet/atoms/context.rb, line 26
    def try_with_cache(obj, source, consume_all)
      beg = source.pos

      # Not in cache yet? Return early.
      unless entry = lookup(obj, beg)
        result = obj.try(source, self, consume_all)

        if obj.cached?
          set obj, beg, [result, source.pos-beg]
        end

        return result
      end

      # the condition in unless has returned true, so entry is not nil.
      result, advance = entry

      # The data we're skipping here has been read before. (since it is in
      # the cache) PLUS the actual contents are not interesting anymore since
      # we know obj matches at beg. So skip reading.
      source.pos = beg + advance
      return result
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.