2010-11-05 118 views
4

我有一个模块,可以自动输出(以点格式)以某种汇编语言(我的编译器的IR)编写的函数。节点是使用“记录”形状打印的基本块。问题是,边走陌生的路,例如:Graphviz Dot中奇怪的边缘位置

digraph { 
node [shape = record]; 
n0[label="{<name> entry | <body> store i, 0\nstore sum, 0\ngoto test | {<target> target}}"]; 
n1[label="{<name> test | <body> t2 = load i\nif t4, body, done | {<true> true | <false> false}}"] 
n2[label="{<name> body | <body> t5 = load sum\ngoto test | {<target> target}}"]; 
n3[color=firebrick3, label="{<name> done | <body> t9 = load sum\nret t9}}"]; 
n0:target:s -> n1:name:n 
n1:true:s -> n2:name:n 
n1:false:s -> n3:name:n 
n2:target:s -> n1:name:n 
} 

和图像:

http://img529.imageshack.us/img529/3780/graphviz.png

我能做些什么,以便从“目标”,以“测试”边缘被放置在左侧?

+0

你能具体谈谈你想图表来一般遵循路由箭头的标准是什么?例如。你想尽量减少过路点? – LarsH 2010-11-06 10:09:57

+0

我希望从'目标'到'测试'的边缘在左侧路由。现在它看起来真的很受欢迎,并且不能真正理解为什么选择这样的路线。 – 2010-11-06 17:35:33

回答

8

最简单的非Guru的方式是强迫这种任性的链接附加在“西侧”。

n2:target:w -> n1:name:w 

这可能适用于这种情况。更通用的方式,但需要更多的思考和编码,但会允许边缘附加到:s和:n如果您需要,添加零大小的不可见节点(color = white,或者可能存在可见性属性),并使用两条边从n2到n1。只有其中一个有箭头。不可见节点将不得不坐在n1或n2的左侧。唉,我的graphvis-fu不够强大,无法创建一个工作示例;也许别人可以创建一个。

alt text