2011-10-02 108 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

對不起,延遲謝謝你的幫助! –