static Set gazelle_allSyntacticPatternsFromInput(S input) { Chain tokens = toChain(javaTokC(input)); new LinkedHashSet out; gazelle_allSyntacticPatternsFromInput_collect(null, tokens, out); ret out; } svoid gazelle_allSyntacticPatternsFromInput_collect(ReverseChain prefix, Chain tokens, Set out) { ping(); if (empty(tokens)) { out.add(joinWithSpace(asList(prefix))); ret; } // output one token gazelle_allSyntacticPatternsFromInput_collect( chainPlus(prefix, first(tokens)), dropFirst(tokens), out); // output * unless last token output was a * // consume between 1 and all tokens if (!eq(last(prefix), "*")) { ReverseChain prefix2 = chainPlus(prefix, "*"); Chain tokens2 = tokens; while (!empty(tokens2)) { tokens2 = dropFirst(tokens2); gazelle_allSyntacticPatternsFromInput_collect(prefix2, tokens2, out); } } }