class Parslet::Atoms::Lookahead

Either positive or negative lookahead, doesn't consume its input.

Example:

str('foo').present? # matches when the input contains 'foo', but leaves it

Attributes

bound_parslet[R]
positive[R]

Public Class Methods

new(bound_parslet, positive=true) click to toggle source
Calls superclass method
# File lib/parslet/atoms/lookahead.rb, line 11
def initialize(bound_parslet, positive=true)
  super()
  
  # Model positive and negative lookahead by testing this flag.
  @positive = positive
  @bound_parslet = bound_parslet
  
  @error_msgs = {
    :positive => ["Input should start with ", bound_parslet], 
    :negative => ["Input should not start with ", bound_parslet]
  }
end

Public Instance Methods

accept(visitor) click to toggle source

Call back visitors visit_lookahead method. See parslet/export for an example.

# File lib/parslet/atoms/visitor.rb, line 69
def accept(visitor)
  visitor.visit_lookahead(positive, bound_parslet)
end
to_s_inner(prec) click to toggle source
# File lib/parslet/atoms/lookahead.rb, line 45
def to_s_inner(prec)
  char = positive ? '&' : '!'
  
  "#{char}#{bound_parslet.to_s(prec)}"
end
try(source, context, consume_all) click to toggle source
# File lib/parslet/atoms/lookahead.rb, line 24
def try(source, context, consume_all)
  rewind_pos  = source.bytepos
  error_pos   = source.pos

  success, value = bound_parslet.apply(source, context, consume_all)
  
  if positive
    return succ(nil) if success
    return context.err_at(self, source, @error_msgs[:positive], error_pos)
  else
    return succ(nil) unless success
    return context.err_at(self, source, @error_msgs[:negative], error_pos)
  end
  
# This is probably the only parslet that rewinds its input in #try.
# Lookaheads NEVER consume their input, even on success, that's why. 
ensure 
  source.bytepos = rewind_pos
end