/* Detect directed cycle and print one if found */ BEG_G{ node_t tp, hp; node_t stk[node_t]; $tvtype = TV_prepostfwd; $tvroot = fstnode($); } N { if (stk[$]) { stk[$] = NULL; } else if ($tvedge == NULL) { /* current root */ stk[$] = $; } else { stk[$] = $tvedge.tail; } } E { if (stk[$.head]) { tp = $.tail; hp = $.head; while (tp != $.head) { printf ("%s -> %s\n", tp.name, hp.name); hp = tp; tp = stk[tp]; } printf ("%s -> %s\n", tp.name, hp.name); exit(0); } }