class Regexp::Expression::Subexpression
def <<(exp)
def <<(exp) if exp.is_a?(WhiteSpace) and @expressions.last and @expressions.last.is_a?(WhiteSpace) @expressions.last.merge(exp) else @expressions << exp end end
def [](index)
def [](index) @expressions[index] end
def all?(&block)
def all?(&block) @expressions.all? {|exp| yield(exp) } end
def clone
def clone copy = super copy.expressions = @expressions.map {|e| e.clone } copy end
def each(&block)
def each(&block) @expressions.each {|e| yield e} end
def each_expression(include_self = false, &block)
Iterates over the expressions of this expression as an array, passing
def each_expression(include_self = false, &block) traverse(include_self) do |event, exp, index| yield(exp, index) unless event == :exit end end
def each_with_index(&block)
def each_with_index(&block) @expressions.each_with_index {|e, i| yield e, i} end
def empty?
def empty? @expressions.empty? end
def first
def first @expressions.first end
def initialize(token)
def initialize(token) super(token) @expressions = [] end
def insert(exp)
def insert(exp) @expressions.insert 0, exp end
def last
def last @expressions.last end
def length
def length @expressions.length end
def map(include_self = false, &block)
for every expression. If a block is not given, returns an array with
Returns a new array with the results of calling the given block once
def map(include_self = false, &block) result = [] each_expression(include_self) do |exp, index| if block_given? result << yield(exp, index) else result << [exp, index] end end result end
def strfregexp_tree(format = '%a', include_self = true, separator = "\n")
def strfregexp_tree(format = '%a', include_self = true, separator = "\n") output = include_self ? [self.strfregexp(format)] : [] output += map {|exp, index| exp.strfregexp(format, (include_self ? 1 : 0), index) } output.join(separator) end
def te
def te ts + to_s.length end
def to_h
def to_h h = super h[:text] = to_s(:base) h[:expressions] = @expressions.map(&:to_h) h end
def to_s(format = :full)
def to_s(format = :full) s = '' # Note: the format does not get passed down to subexpressions. case format when :base s << @text.dup s << @expressions.map{|e| e.to_s}.join unless @expressions.empty? else s << @text.dup s << @expressions.map{|e| e.to_s}.join unless @expressions.empty? s << @quantifier if quantified? end s end
def traverse(include_self = false, &block)
- For terminal expressions, :visit is called once.
:exit upon exiting it.
- For subexpressions, :enter upon entrering the subexpression, and
The event argument is passed as follows:
the expression, and the index of the expression within its parent.
block for each expression with three arguments; the traversal event,
Traverses the subexpression (depth-first, pre-order) and calls the given
def traverse(include_self = false, &block) raise 'traverse requires a block' unless block_given? block.call(:enter, self, 0) if include_self each_with_index do |exp, index| if exp.terminal? block.call(:visit, exp, index) else block.call(:enter, exp, index) exp.traverse(&block) block.call(:exit, exp, index) end end block.call(:exit, self, 0) if include_self self end
def ts
def ts starts_at end