private static Parser<Filter> query(Parser<Filter> atom) { Parser.Reference<Filter> ref = Parser.newReference(); Parser<Filter> unit = ref.lazy().between(term("("), term(")")).or(atom); Parser<Filter> parser = new OperatorTable<Filter>() .infixl(op(",", BinaryOperator.OR), 10) .infixl(op("+", BinaryOperator.AND), 20) .build(unit); ref.set(parser); return parser; }