Class: Crokus::CFGOnlyPrinterDot

Inherits:
CFGOnlyPrinter show all
Defined in:
lib/crokus/cfg_printer_only_dot.rb

Constant Summary

Constants included from Indent

Indent::INDENT

Instance Method Summary collapse

Methods inherited from CFGOnlyPrinter

#dump, #visitFunction

Methods inherited from Visitor

#initialize, #visit, #visitAddressOf, #visitArrayOf, #visitArrayOrStructInit, #visitArrow, #visitAssign, #visitBinary, #visitBody, #visitBreak, #visitCase, #visitCastedExpr, #visitCasting, #visitCharLit, #visitCommaStmt, #visitCondExpr, #visitContinue, #visitDecl, #visitDefine, #visitDeref, #visitDesignUnit, #visitDoWhile, #visitFloatLit, #visitFor, #visitFormalArg, #visitFunCall, #visitFunction, #visitFunctionProto, #visitGoto, #visitIdent, #visitIf, #visitInclude, #visitIndexed, #visitIntLit, #visitLabelledStmt, #visitParenth, #visitPointed, #visitPointerTo, #visitPostFixAccu, #visitPreFixAccu, #visitReturn, #visitSizeof, #visitStrLit, #visitStruct, #visitSwitch, #visitToken, #visitType, #visitTypedef, #visitUnary, #visitWhile

Methods included from Indent

#dedent, #indent, #say

Constructor Details

This class inherits a constructor from Crokus::Visitor

Instance Method Details



50
51
52
# File 'lib/crokus/cfg_printer_only_dot.rb', line 50

def footer
  @code << "}"
end

#headerObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/crokus/cfg_printer_only_dot.rb', line 7

def header
  @code << "digraph ControlFlowGraph {"
  @code.indent=2
  @code << "forcelabels=true;"
  @code << "graph [ label=\"\","
  @code << "        bgcolor=\"white\","
  @code << "        fontname=\"Arial\","
  @code << "        rankdir=\"TB\"]"
  @code.newline
  @code << "node  [ fontname=\"Arial\","
  @code << "        shape=\"box\","
  @code << "        style=\"filled\","
  @code << "        fillcolor=\"AliceBlue\"]"
  @code.newline
  @code << "edge  [ fontname=\"Arial\","
  @code << "        color=\"Blue\","
  @code << "        dir=\"forward\"]"
end

#visit_rec(bb) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/crokus/cfg_printer_only_dot.rb', line 26

def visit_rec bb
  @visited << bb
  @code << "bb_#{bb.label} [label=\"\",shape=rectangle, xlabel=#{bb.label}]"
  @current=bb
  if (ite=bb.stmts.last).is_a? ITE

    unless @visited.include? (bb_t=ite.trueBranch)
        visit_rec(bb_t)
    end
    unless @visited.include? (bb_f=ite.falseBranch)
        visit_rec(bb_f)
    end
    @code << "bb_#{bb.label} -> bb_#{(bb_t=ite.trueBranch).label} [label=\"T\"]"
    @code << "bb_#{bb.label} -> bb_#{(bb_f=ite.falseBranch).label} [label=\"F\"]"
  else
    bb.succs.each do |succ|
      unless @visited.include? succ
        visit_rec(succ)
      end
      @code << "bb_#{bb.label} -> bb_#{succ.label}"
    end
  end
end