class ABNF::Seq
Attributes
elts[R]
Public Class Methods
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