downwards(child)
click to toggle source
def downwards child
if @parent && !@known_links.include?([@parent, child])
@graph.add_edges(@parent, child)
@known_links << [@parent, child]
end
end
escape(str)
click to toggle source
def escape str
str.gsub('"', "'")
end
node(name, opts={})
click to toggle source
def node name, opts={}
@graph.add_nodes name.to_s, opts
end
recurse(node, current)
click to toggle source
def recurse node, current
@parent = current
node.accept(self)
end
visit_alternative(alternatives)
click to toggle source
def visit_alternative(alternatives)
p = parent
alternatives.each do |atom|
recurse atom, p
end
end
visit_entity(name, block)
click to toggle source
def visit_entity(name, block)
s = node(name)
downwards s
return if @visited.include?(name)
@visited << name
recurse block.call, s
end
visit_lookahead(positive, atom)
click to toggle source
def visit_lookahead(positive, atom)
recurse atom, parent
end
visit_named(name, atom)
click to toggle source
def visit_named(name, atom)
recurse atom, parent
end
visit_parser(root)
click to toggle source
def visit_parser(root)
recurse root, node('parser')
end
visit_re(regexp)
click to toggle source
visit_repetition(tag, min, max, atom)
click to toggle source
def visit_repetition(tag, min, max, atom)
recurse atom, parent
end
visit_sequence(sequence)
click to toggle source
def visit_sequence(sequence)
p = parent
sequence.each do |atom|
recurse atom, p
end
end
visit_str(str)
click to toggle source