152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
# File 'lib/aurum/grammar/builder/parsing_table_builder.rb', line 152
def traverse node
return @result[node] if @indicitor[node]
to_be_continued, @result[node], @indicitor[node] = @condition.call(node)
if to_be_continued
@stack.push(node)
@indicitor[node] = (cycle_indicitor = @stack.length)
@result[node] = node.map_to_set
node.result_each do |new_node|
traverse(new_node) unless @indicitor[new_node]
@indicitor[node] = [@indicitor[node], @indicitor[new_node]].min
@result[node] |= @result[new_node]
end
node_in_cycle = nil
until node_in_cycle == node
node_in_cycle = @stack.pop
@result[node_in_cycle] = @result[node].dup
@indicitor[node_in_cycle] = 65535
end if @indicitor[node] == cycle_indicitor
end
@result[node]
end
|