Graphviz.point de noeud de commande

je construis un epsilon NFA pour reconnaître une expression régulière en utilisant la construction canonique. J'utilise des subgraphes pour regrouper diverses parties de l'expression régulière. L'opérateur * me pose un problème particulier puisque dot a décidé de déplacer l'ordre des noeuds. J'ai essayé d'ajouter des poids de bord pour forcer des bords particuliers à être court pour garder l'ordre des bords dans la ligne, mais cela ne semble pas fonctionner.

Ce que je voudrais faire est de forcer le les noeuds d'un sous-paragraphe doivent être placés dans un ordre particulier de sorte que le graphique de sortie soit reconnaissable comme un type particulier de construction (bien connu). Dans l'exemple ci-dessous je voudrais bords 3, 4, 5 et 6 placés dans l'ordre, cependant, le point place dans l'ordre 6, 3, 4, 5. Tous les conseils sont appréciés.

noter que le paramètre de poids actuel ne produit aucune différence que pas de paramètre de poids du tout.

j'ai le texte suivant

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

26
demandé sur marapet 2011-10-02 21:12:54

1 réponses

Voici comment j'écrirais ce graphique:

  • tout d'abord, pour moi c'est un graphe qui va de haut en bas, pas de gauche à droite, donc j'ai enlevé le rankdir=LR et ajouté rank=same seulement pour les noeuds 0/1 et les noeuds 2/3.
  • j'ai enlevé tous les poids
  • le plus important, j'ai ajouté constraint=false aux bords allant contre la direction du graphe - celui allant du noeud 4 au noeud 5, et celui de noeud 6 à noeud 3.

ici la source:

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

et voici le résultat:

graphviz output

maintenant si vous voulez, vous pouvez garder rankdir=LR , juste prendre le markup que vous avez posté, enlever les poids et ajouter constraint=false aux mêmes bords que je l'ai fait, cela fonctionne, aussi.

32
répondu marapet 2011-10-02 19:34:14