interface Parser<T> { Result<T> parse (PushbackReader in) throws IOException; } class Arithmetic { final static Parser<Integer> product = Combine.transform( Combine.sepBy(Atom.expect('*'), Basic.natural), Combine.fold(1, new Function<Pair<Integer, Integer>, Integer>() { public Integer compute(Pair<Integer, Integer> x) { return x.getFirst() * x.getSecond(); } })); }