有向グラフと無向グラフの変換 #2

前掲のgvprプログラムではうまく変換できないDOTデータがあった。

$ gvpr -c "BEG_G { node($, 'tubeworm'); }" shiritori.gv | tee fellows.gv
digraph kobutanukituneko {
        piglet -> "raccoon dog";
        "raccoon dog" -> fox;
        fox -> cat;
        cat -> piglet;
        tubeworm;
}

$ gvpr "BEG_G { graph_t g = graph(name, 'U'); } E { clone(g, $); } END_G { write(g); }" fellows.gv
graph kobutanukituneko {
        piglet -- "raccoon dog";
        "raccoon dog" -- fox;
        fox -- cat;
        cat -- piglet;
}

のように、孤立ノードがクローンされていない。
エッジをクローンする時にその端点のノードも自動的にクローンしてくれるのだが、
エッジが入出力していない孤立ノードはE節の対象外になることが原因だった。

$ gvpr "BEG_G { graph_t g = graph(name, 'U'); } E { clone(g, $); } N { clone(g, $); } END_G { write(g); }" fellows.gv
graph kobutanukituneko {
        piglet -- "raccoon dog";
        "raccoon dog" -- fox;
        fox -- cat;
        cat -- piglet;
        tubeworm;
}

N節なら孤立ノードも対象となる。
このN節でもクローンを行うことでチューブワームもみんなの仲間になる。
無向グラフから有向グラフへの変換についても全く同じコードをN節に追加すればいい。