2011-10-02 4 views
25

Sto costruendo un NFA epsilon per riconoscere un'espressione regolare utilizzando la costruzione canonica. Sto usando i sottografi per raggruppare varie parti dell'espressione regolare. L'operatore * mi sta dando problemi particolari dato che dot ha deciso di spostare l'ordine dei nodi. Ho provato ad aggiungere i pesi dei bordi per forzare i bordi particolari a essere brevi per mantenere l'ordine dei bordi in linea, ma non sembra funzionare.Graphviz. Ordinamento nodo finale

Quello che mi piacerebbe fare è forzare i nodi in un sottografo in per essere inseriti in un ordine particolare in modo che il grafico di output sia riconoscibile come un particolare tipo di costruzione (ben nota). Nell'esempio seguente vorrei che i bordi 3, 4, 5 e 6 fossero posizionati in quell'ordine, tuttavia il punto li colloca nell'ordine 6, 3, 4, 5. Qualsiasi suggerimento è apprezzato.

Si noti che il parametro peso attuale non produce alcuna differenza rispetto a nessun parametro di peso.

Ho il seguente

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

risposta

30

Ecco come mi piacerebbe scrivere che grafico:

  • Prima di tutto, per me questo è un grafico che va dall'alto verso il in basso, non da sinistra a destra, quindi ho rimosso il rankdir=LR e aggiunto rank=same solo per i nodi 0/1 e i nodi 2/3.
  • Ho rimosso tutti i pesi
  • Soprattutto, ho aggiunto constraint=false ai bordi vanno contro la direzione del grafico - quello che va dal nodo 4 al nodo 5, e quella dal nodo 6 al nodo 3.

qui la fonte:

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]; 
} 

Ed ecco il risultato:

graphviz output

Ora, se lo si desidera, è possibile mantenere rankdir=LR, solo prendere il markup che hai postato, rimuovere i pesi e aggiungere constraint=false agli stessi bordi come ho fatto io, funziona anche.

+0

Ci scusiamo per il ritardo, grazie per l'aiuto! –