Class: Parslet::Atoms::Lookahead
- Defined in:
- lib/parslet/atoms/lookahead.rb,
lib/parslet/atoms/visitor.rb
Overview
Either positive or negative lookahead, doesn’t consume its input.
Example:
str('foo').present? # matches when the input contains 'foo', but leaves it
Constant Summary
Constants included from Precedence
Precedence::ALTERNATE, Precedence::BASE, Precedence::LOOKAHEAD, Precedence::OUTER, Precedence::REPETITION, Precedence::SEQUENCE
Instance Attribute Summary collapse
-
#bound_parslet ⇒ Object
readonly
Returns the value of attribute bound_parslet.
-
#positive ⇒ Object
readonly
Returns the value of attribute positive.
Instance Method Summary collapse
-
#accept(visitor) ⇒ Object
Call back visitors #visit_lookahead method.
-
#initialize(bound_parslet, positive = true) ⇒ Lookahead
constructor
A new instance of Lookahead.
- #to_s_inner(prec) ⇒ Object
- #try(source, context) ⇒ Object
Methods inherited from Base
#apply, #inspect, #parse, #parse_with_debug, precedence, #setup_and_apply, #to_s
Methods included from CanFlatten
#flatten, #flatten_repetition, #flatten_sequence, #foldl, #merge_fold, #warn_about_duplicate_keys
Methods included from DSL
#>>, #absent?, #as, #maybe, #present?, #repeat, #|
Constructor Details
#initialize(bound_parslet, positive = true) ⇒ Lookahead
Returns a new instance of Lookahead.
11 12 13 14 15 16 17 18 19 20 21 22 |
# 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 |
Instance Attribute Details
#bound_parslet ⇒ Object (readonly)
Returns the value of attribute bound_parslet.
9 10 11 |
# File 'lib/parslet/atoms/lookahead.rb', line 9 def bound_parslet @bound_parslet end |
#positive ⇒ Object (readonly)
Returns the value of attribute positive.
8 9 10 |
# File 'lib/parslet/atoms/lookahead.rb', line 8 def positive @positive end |
Instance Method Details
#accept(visitor) ⇒ Object
Call back visitors #visit_lookahead method. See parslet/export for an example.
69 70 71 |
# File 'lib/parslet/atoms/visitor.rb', line 69 def accept(visitor) visitor.visit_lookahead(positive, bound_parslet) end |
#to_s_inner(prec) ⇒ Object
44 45 46 47 48 |
# File 'lib/parslet/atoms/lookahead.rb', line 44 def to_s_inner(prec) char = positive ? '&' : '!' "#{char}#{bound_parslet.to_s(prec)}" end |
#try(source, context) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/parslet/atoms/lookahead.rb', line 24 def try(source, context) pos = source.pos success, value = bound_parslet.apply(source, context) if positive return succ(nil) if success return context.err_at(self, source, @error_msgs[:positive], pos) else return succ(nil) unless success return context.err_at(self, source, @error_msgs[:negative], 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.pos = pos end |