class Astrapi::DotPrinter
Attributes
code[RW]
nodes_cnx[RW]
nodes_decl[RW]
Public Instance Methods
print(ast)
click to toggle source
# File lib/dot_printer.rb, line 13 def print ast #entry method @verbose=false @nodes_decl=Code.new @nodes_cnx=Code.new @printed_cnx={} #Cosmetic ! to keep track of already printed cnx source->sink @code=Code.new code << "digraph G {" code.indent=2 code << "ordering=out;" code << "ranksep=.4;" code << "bgcolor=\"lightgrey\";" code.newline code << "node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"" code << " width=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];" code << "edge [arrowsize=.5, color=\"black\", style=\"bold\"]" process(ast) code << @nodes_decl code << @nodes_cnx code.indent=0 code << "}" return code end
process(node,level=0)
click to toggle source
# File lib/dot_printer.rb, line 36 def process node,level=0 kname=node.class.name.split("::")[1] id=node.object_id nodes_decl << "#{id} [label=\"#{kname}\"]" node.instance_variables.each{|vname| ivar=node.instance_variable_get(vname) vname=vname.to_s[1..-1] case ivar when Array ivar.each_with_index{|e,idx| sink=process(e,level+2) @printed_cnx[id]||=[] nodes_cnx << "#{id} -> #{sink} [label=\"#{vname}[#{idx}]\"]" if not @printed_cnx[id].include? sink @printed_cnx[id] << sink } when Token val=ivar.val sink="#{ivar.object_id}" nodes_decl << "#{sink} [label=\"#{val}\",color=\"red\"]" @printed_cnx[id]||=[] nodes_cnx << "#{id} -> #{sink} [label=\"#{vname}\"]" if not @printed_cnx[id].include? sink @printed_cnx[id] << sink else sink=process(ivar,level+2) @printed_cnx[id]||=[] nodes_cnx << "#{id} -> #{sink} [label=\"#{vname}\"]" if not @printed_cnx[id].include? sink @printed_cnx[id] << sink end } return id end