Graphviz 点节点排序
我正在构建一个epsilon NFA,以使用规范结构识别正则表达式。我使用子图对正则表达式的各个部分进行分组。*操作符给我带来了特别的麻烦,因为dot决定移动节点的顺序。我尝试添加边权重,以强制特定边变短,以保持边的顺序一致,但这似乎不起作用 我想做的是强制子图中的节点按特定顺序放置,以便输出图可以识别为特定类型的(众所周知的)构造。在下面的示例中,我希望边3、4、5和6按该顺序放置,但是圆点将它们按6、3、4、5的顺序放置。欢迎指点 请注意,当前“权重”参数与“完全没有权重”参数相比不会产生任何差异 我有以下几点Graphviz 点节点排序,graphviz,dot,Graphviz,Dot,我正在构建一个epsilon NFA,以使用规范结构识别正则表达式。我使用子图对正则表达式的各个部分进行分组。*操作符给我带来了特别的麻烦,因为dot决定移动节点的顺序。我尝试添加边权重,以强制特定边变短,以保持边的顺序一致,但这似乎不起作用 我想做的是强制子图中的节点按特定顺序放置,以便输出图可以识别为特定类型的(众所周知的)构造。在下面的示例中,我希望边3、4、5和6按该顺序放置,但是圆点将它们按6、3、4、5的顺序放置。欢迎指点 请注意,当前“权重”参数与“完全没有权重”参数相比不会产生任
digraph G {
rankdir = LR;
node [shape = none];
0 [label = "start"];
node [shape = circle];
1 [label = "q1"];
2 [label = "q2"];
3 [label = "q3"];
4 [label = "q4"];
5 [label = "q5"];
node [shape = doublecircle];
6 [label = "q6"];
subgraph re1 {
rank = same;
edge[label = "0"];
1 -> 2;
};
subgraph re2 {
rank = same;
edge[label = "ε"];
3 -> 4 [weight = 10];
edge[label = "1"];
4 -> 5 [weight = 10];
edge[label = "ε"];
5 -> 6 [weight = 10];
5 -> 4 [weight = 1];
6 -> 3 [weight = 1];
};
edge[color=black];
0 -> 1
edge[label = "ε"];
2 -> 3;
}
以下是我如何编写图表:
- 首先,对我来说,这是一个从上到下,而不是从左到右的图,因此我删除了
,只为节点0/1和节点2/3添加了rankdir=LR
rank=same
- 我去掉了所有的重物
- 最重要的是,我将
添加到与图形方向相反的边上-从节点4到节点5的边,以及从节点6到节点3的边constraint=false
digraph G {
0 [label = "start", shape = none];
node [shape = circle];
1 [label = "q1"];
2 [label = "q2"];
3 [label = "q3"];
4 [label = "q4"];
5 [label = "q5"];
6 [label = "q6", shape = doublecircle];
{rank = same; 0 -> 1; }
1 -> 2 [label = "0"];
{rank = same; 2 -> 3 [label = "ε"]; }
4 -> 5 [label = "1"];
edge [label = "ε"];
3 -> 4;
5 -> 6;
5 -> 4 [constraint = false];
6 -> 3 [constraint = false];
}
结果如下:
现在,如果您愿意,您可以保留rankdir=LR
,只需获取您发布的标记,移除权重,并将constraint=false
添加到与我相同的边缘,它也可以工作