assume no loopy productions