正規構造を使用して正規表現を認識するイプシロンNFAを構築しています。正規表現のさまざまな部分をグループ化するためにサブグラフを使用しています。 *演算子は、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;
}
これが私がそのグラフを書く方法です:
rankdir=LR
を削除し、ノード0/1およびノード2/3に対してのみrank=same
を追加しました。constraint=false
を追加したことです。ここにソース:
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];
}
そしてここに結果があります:
必要に応じて、rankdir=LR
を保持し、投稿したマークアップを取り、重みを削除し、constraint=false
を私と同じエッジに追加するだけでうまくいきます。