class Astrapi::DotPrinter

Attributes

code[RW]
nodes_cnx[RW]
nodes_decl[RW]

Public Instance Methods

print(ast) click to toggle source
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