Graphviz Dot中奇怪的边缘位置

时间:2010-11-05 14:47:07

标签: graph graphviz edge graph-layout

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

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

我能做些什么,以便从'目标'到'测试'的边缘放在左侧?

1 个答案:

答案 0 :(得分:9)

最简单的非上师方式是强制在“西方”方面附加任意方式。

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

这可能适用于这种情况。一种更通用的方式,但需要更多的思考和编码,但是允许边缘附加到:s和:n如果你想要的话,是添加一个大小为零的不可见节点(颜色=白色,或者可能有可见性)属性)并使用两条边从n2到n1。只在其中一个上面有箭头。不可见节点必须位于n1或n2的左侧。唉,我的graphvis-fu不够强大,无法创造出一个有效的例子;也许其他人可以创建一个。

alt text