Class: RegExpr::Block

Inherits:
Segment show all
Defined in:
lib/regexpr.rb

Overview

/(VALUE)/ or /(?:VALUE)/

Instance Attribute Summary collapse

Attributes inherited from Segment

#value

Instance Method Summary collapse

Methods inherited from Segment

deepest, nooptimize, novalue, optimize

Constructor Details

#initialize(*val) ⇒ Block

Returns a new instance of Block.



71
72
73
74
75
# File 'lib/regexpr.rb', line 71

def initialize *val
	val= val[ 0]  if ::Array === val[ 0] and val.size == 1
	super val
	@hidden= true
end

Instance Attribute Details

#hiddenObject

Returns the value of attribute hidden.



53
54
55
# File 'lib/regexpr.rb', line 53

def hidden
  @hidden
end

#nameObject

Returns the value of attribute name.



53
54
55
# File 'lib/regexpr.rb', line 53

def name
  @name
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


58
# File 'lib/regexpr.rb', line 58

def empty?() @value.empty? end

#hidden?Boolean

Returns:

  • (Boolean)


54
# File 'lib/regexpr.rb', line 54

def hidden?() @hidden end

#inspectObject



61
62
63
# File 'lib/regexpr.rb', line 61

def inspect
	"#<#{self.class.name}: (#{hidden? ? '?:' : ''} #{value.map(&:inspect).join ' '} )>"
end

#namesObject



65
66
67
68
69
# File 'lib/regexpr.rb', line 65

def names
	names= @value.collect &:names
	names.push( name)  unless self.hidden?
	names.flatten.compact
end

#optimizeObject



55
# File 'lib/regexpr.rb', line 55

def optimize() self.dup.optimize! end

#optimize!Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/regexpr.rb', line 77

def optimize!
	list, chars= [[]], RegExpr::Chars.new( '')

	@value.each do |v|
		v= self.class.optimize v
		if RegExpr::Or === v
			list.push []
		else list[ -1].push v
		end
	end
	#return self

	# [A,C,A,C,Cs,As,C,Cs,C] => [A,A,As], chars = [C,C|Cs]++[C|Cs]++[C]
	list.delete_if do |v|
		if (1 == v.size and RegExpr::Chars === v[ 0]) or RegExpr::Char === v[ 0]
			chars+= v[ 0]
		else false
		end
	end
	chars= chars.optimize

	values= []
	list.each do |v|
		values.push RegExpr::Or.new
		values+= if v.size == 1 and RegExpr::Block === v[ 0] and v[ 0].hidden
				v[ 0].value
			else
				v.collect do |w|
					if RegExpr::Block === w and w.hidden
						u= false
						w.value.each do |i|
							break  unless u||= RegExpr::Or === i
						end
						u ? w : w.value
					else w
					end
				end.flatten.compact
			end
	end
	values.push RegExpr::Or.new, chars  if chars.size > 0
	values.shift
	@value= values
	self
end

#popObject



57
# File 'lib/regexpr.rb', line 57

def pop() @value.pop end

#push(*v) ⇒ Object



56
# File 'lib/regexpr.rb', line 56

def push( *v) @value.push *v end

#sizeObject



59
# File 'lib/regexpr.rb', line 59

def size() @value.size end

#to_rObject



122
123
124
# File 'lib/regexpr.rb', line 122

def to_r()
	(@hidden ? '(?:%s)' : '(%s)')% @value.collect( &:to_r).join( '')
end