4 fun print_dot
( f
: OStream, long
: Bool )
6 f
.write
("digraph \{\n")
7 f
.write
("charset=latin1\n")
8 f
.write
("node [shape=box,style=rounded,fontname=courier]\n")
9 for block
in blocks
do block
.print_dot_nodes
(f
, long
)
10 for block
in blocks
do block
.print_dot_edges
(f
, long
)
15 redef class BasicBlock
16 fun print_dot_nodes
( f
: OStream, long
: Bool )
20 lbl
= "\"{name}:\\n
{dot_node_text}\
""
24 f
.write
( "{name} [label={lbl}]\n" )
27 fun dot_node_text
: String
29 var code_lines
= new Array[String]
30 for line
in lines
do code_lines
.add
(line
.text
)
31 var code
= code_lines
.join
("")
33 code
= code
.replace
("\n","\\l").replace
("\"","\\\
"").replace
("\\n","|n").replace
("/","\\/").replace
("\r","")
34 # the last one is a hack
35 return "{dot_node_header}{code}{dot_node_footer}"
38 fun dot_node_header
: String do return ""
39 fun dot_node_footer
: String do return ""
41 fun print_dot_edges
( f
: OStream, long
: Bool )
43 for s
in successors
do
44 f
.write
( "{name} -> {s.name}\n" )
48 f
.write
( "{name} -> {n.name} [style=\"dashed\
"]\n" )