Graphviz .dot节点排序

32
我正在使用经典构造法来构建一个识别正则表达式的epsilon NFA,使用子图来分组正则表达式的各个部分。*运算符让我特别困扰,因为dot决定改变节点的顺序。我尝试添加边权重以强制保持边的顺序,但似乎不起作用。
我想强制将子图中的节点按照一定顺序放置,以便输出图形可以被识别为特定类型的(公认的)构造。在下面的示例中,我希望将边3、4、5和6按照那个顺序放置,但是dot将它们放置在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;
}

graphiz output

1个回答

38

以下是我编写这个图表的方法:

  • 首先,我认为这是一个自上而下的图表,而不是从左到右,因此我删除了rankdir=LR,仅为节点0/1和节点2/3添加了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];
}

这是结果:

graphviz output

如果您愿意的话,可以保留rankdir=LR,只需使用您发布的标记,删除权重并向与我相同的边缘添加constraint=false即可。 它也能工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接