class ABNF::Seq

Attributes

elts[R]

Public Class Methods

_new(*elts)
Alias for: new
new(*elts) click to toggle source
# File lib/abnf/grammar.rb, line 87
def Seq.new(*elts)
  elts2 = []
  elts.each {|e|
    if e.empty_sequence?
      next
    elsif Seq === e
      elts2.concat e.elts
    elsif e.empty_set?
      return EmptySet
    else
      elts2 << e
    end
  }
  case elts2.length
  when 0; EmptySequence
  when 1; elts2.first
  else; Seq._new(*elts2)
  end
end
Also aliased as: _new
new(*elts) click to toggle source
# File lib/abnf/grammar.rb, line 107
def initialize(*elts)
  @elts = elts
end

Public Instance Methods

each_var(&block) click to toggle source
# File lib/abnf/grammar.rb, line 116
def each_var(&block) @elts.each {|elt| elt.each_var(&block)} end
empty_sequence?() click to toggle source
# File lib/abnf/grammar.rb, line 112
def empty_sequence?
  @elts.empty?
end
recursion(syms, lhs) click to toggle source
# File lib/abnf/regexp.rb, line 225
def recursion(syms, lhs)
  case @elts.length
  when 0
    NonRecursion
  when 1
    @elts.first.recursion(syms, lhs)  
  else
    (1...(@elts.length-1)).each {|i|
      return OtherRecursion if @elts[i].recursion(syms, lhs) != NonRecursion
    }

    r_left = @elts.first.recursion(syms, lhs)
    return OtherRecursion if r_left & ~(NonRecursion|JustRecursion|LeftRecursion|SelfRecursion) != 0
    r_left = (r_left & ~JustRecursion) | LeftRecursion if r_left & JustRecursion != 0

    r_right = @elts.last.recursion(syms, lhs)
    return OtherRecursion if r_right & ~(NonRecursion|JustRecursion|RightRecursion|SelfRecursion) != 0
    r_right = (r_right & ~JustRecursion) | RightRecursion if r_right & JustRecursion != 0

    if r_left == NonRecursion
      r_right
    elsif r_right == NonRecursion
      r_left
    else
      OtherRecursion
    end
  end
end
regexp_tree() click to toggle source
# File lib/abnf/regexp.rb, line 391
def regexp_tree() RegexpTree.seq(*@elts.map {|e| e.regexp_tree}) end
remove_just_recursion(n) click to toggle source
# File lib/abnf/regexp.rb, line 254
def remove_just_recursion(n)
  self
end
split_left_recursion(n) click to toggle source
# File lib/abnf/regexp.rb, line 258
def split_left_recursion(n)
  case @elts.length
  when 0
    [self, EmptySet]
  when 1
    @elts.first.split_left_recursion(n)
  else
    nonrec, rest = @elts.first.split_left_recursion(n)
    rest1 = Seq.new(*@elts[1..-1])
    nonrec += rest1
    rest += rest1
    [nonrec, rest]
  end
end
split_recursion(n) click to toggle source
# File lib/abnf/regexp.rb, line 288
def split_recursion(n)
  case @elts.length
  when 0
    [EmptySet, self, EmptySet]
  when 1
    @elts.first.split_recursion(n)
  else
    leftmost_nonrec, leftmost_rest_right = @elts.first.split_left_recursion(n)
    rightmost_nonrec, rightmost_rest_left = @elts.last.split_right_recursion(n)
    rest_middle = Seq.new(*@elts[1...-1])

    if leftmost_rest_right.empty_set?
      [leftmost_nonrec + rest_middle + rightmost_rest_left,
       leftmost_nonrec + rest_middle + rightmost_nonrec,
       EmptySet]
    elsif rightmost_rest_left.empty_set?
      [EmptySet,
       leftmost_nonrec + rest_middle + rightmost_nonrec,
       leftmost_rest_right + rest_middle + rightmost_nonrec]
    else
      raise Exception.new("non left/right recursion") # bug
    end
  end
end
split_right_recursion(n) click to toggle source
# File lib/abnf/regexp.rb, line 273
def split_right_recursion(n)
  case @elts.length
  when 0
    [self, EmptySet]
  when 1
    @elts.first.split_right_recursion(n)
  else
    nonrec, rest = @elts.last.split_right_recursion(n)
    rest1 = Seq.new(*@elts[0...-1])
    nonrec = rest1 + nonrec
    rest = rest1 + rest
    [nonrec, rest]
  end
end
subst_var(&block) click to toggle source
# File lib/abnf/grammar.rb, line 117
def subst_var(&block) Seq.new(*@elts.map {|elt| elt.subst_var(&block)}) end
useful?(useful_names) click to toggle source
# File lib/abnf/abnf.rb, line 121
def useful?(useful_names) @elts.all? {|e| e.useful?(useful_names)} end