class Crokus::AstPrinter

Attributes

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

Public Instance Methods

clean(code) click to toggle source

suppress syndrom : name=“”not correct“”

# File lib/crokus/ast_printer.rb, line 75
def clean code
  #puts "=> cleaning dot code"
  code.lines.each_with_index do |line,idx|
    if line=~/\"\"(.*)\"\"/
      code.lines[idx].gsub!(/\"\"(.*)\"\"/,"\"#{$1}\"")
    end
  end
end
print(ast) click to toggle source
process(node,level=0) click to toggle source
# File lib/crokus/ast_printer.rb, line 38
def process node,level=0
  #puts "processing #{node}"
  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]
    if ivar
      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
    end
  }
  return id
end