예제 #1
0
        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))"));
            });
        }