Graphviz.dot node заказ
Я создаю epsilon NFA для распознавания регулярного выражения с использованием канонической конструкции. Я использую подграфы для группировки различных частей регулярного выражения. Оператор * дает мне особые проблемы, поскольку точка решила переместить порядок узлов вокруг. Я попробовал добавить вес границ, чтобы ограничить конкретные края, чтобы сохранить порядок краев в строке, но это, похоже, не работает.
То, что я хотел бы сделать, - заставить узлы в подграфе быть помещены в конкретный порядок, чтобы выходной граф был распознан как конкретный тип (хорошо известной) конструкции. В приведенном ниже примере я хотел бы, чтобы края 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]()
Ответы
Ответ 1
Вот как я бы написал этот график:
- Прежде всего, для меня это график, который идет сверху вниз, а не слева направо, поэтому я удалил
rankdir=LR
и добавил rank=same
только для узлов 0/1 и узлов 2/3.
- Я удалил все веса
- Самое главное, я добавил
constraint=false
к ребрам, идущим против направления графика: тот, который идет от node 4 до node 5, а другой от node 6 до node 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
на те же края, что и я, это тоже работает.