public void ChainrTest() { var number = Chars.Digit().Many1() .Map(value => new String(value.ToArray())); var opAdd = Chars.Char('+') .Map(_ => new Func <String, String, String>((lhs, rhs) => String.Format("({0}+{1})", lhs, rhs))); var opSub = Chars.Char('-') .Map(_ => new Func <String, String, String>((lhs, rhs) => String.Format("({0}-{1})", lhs, rhs))); var term = number; var expr = Combinator.Chainr(term, opAdd.Or(opSub)).Or(term); expr.Run("1".AsStream()).Case( failure: (restStream, _) => Assert.Fail(), success: (restStream, value) => { Assert.True(Enumerable.SequenceEqual(value, "1")); }); expr.Run("1+2-3".AsStream()).Case( failure: (restStream, _) => Assert.Fail(), success: (restStream, value) => { Assert.True(Enumerable.SequenceEqual(value, "(1+(2-3))")); }); }