2011-10-02 140 views
25

Estoy construyendo un epsilon NFA para reconocer una expresión regular usando la construcción canónica. Estoy usando subgrafos para agrupar varias partes de la expresión regular. El * operador me está dando problemas particulares ya que el punto ha decidido mover el orden de los nodos. He intentado agregar pesos de borde para forzar que los bordes particulares sean cortos para mantener el orden de los bordes en línea, pero eso no parece funcionar.Graphviz orden de nodo .dot

Lo que me gustaría hacer es forzar a los nodos en un subgráfico a colocarse en un orden particular para que el gráfico de salida sea reconocible como un tipo particular de construcción (bien conocida). En el siguiente ejemplo, me gustaría que los bordes 3, 4, 5 y 6 se coloquen en ese orden, sin embargo, el punto los ubica en el orden 6, 3, 4, 5. Cualquier puntero apreciado.

Tenga en cuenta que el parámetro de peso actual no produce ninguna diferencia que ningún parámetro de peso en absoluto.

Tengo el siguiente

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

Respuesta

30

Así es como me gustaría escribir ese gráfico:

  • En primer lugar, para mí esto es una gráfica que va de arriba hacia abajo, no de izquierda a derecha, por lo tanto, eliminé el rankdir=LR y agregué rank=same solo para nodos 0/1 y nodos 2/3.
  • I eliminan todos los pesos
  • más importante, añadí constraint=false a los bordes que van en contra de la dirección de la gráfica - el que va desde el nodo 4 hacia el nodo 5, y el de nodo 6 al nodo 3.

aquí la fuente:

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

Y aquí está el resultado:

graphviz output

Ahora, si lo desea, puede guardar rankdir=LR, simplemente tome el marcado que publicó, quite los pesos y agregue constraint=false en los mismos bordes que yo, también funciona.

+0

Disculpa la demora, gracias por la ayuda! –

Cuestiones relacionadas