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
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
error_msgs() click to toggle source
# File lib/parslet/atoms/lookahead.rb, line 19
def error_msgs
  @error_msgs ||= {
    :positive => ["Input should start with ", bound_parslet],
    :negative => ["Input should not start with ", bound_parslet]
  }
end
to_s_inner(prec) click to toggle source
# File lib/parslet/atoms/lookahead.rb, line 47
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 26
def try(source, context, consume_all)
  rewind_pos  = source.bytepos
  error_pos   = source.pos

  success, _ = 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