2011-10-02 167 views
25

我正在构建一个epsilon NFA来识别使用规范构造的正则表达式。我使用子图将正则表达式的各个部分分组。 *运算符给我特别麻烦,因为点决定移动节点的顺序。我已经尝试添加边权重来强制特定的边是短的,以保持边缘的顺序,但似乎没有工作。Graphviz .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; 
} 

graphiz output

回答

30

以下是我会写图:

  • 首先,对我来说这是一个从上那张图底部,而不是从左到右,因此我删除了rankdir=LR并且仅为节点0/1和节点2/3添加了rank=same
  • 我删除所有的权
  • 最重要的是,我添加constraint=false到边缘逆着图的方向 - 该一个从节点4将节点5,以及节点的一个从节点6 3.

这里来源:

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到我所做的相同的边缘,它也可以。

+0

对不起,延迟谢谢你的帮助! –