Esempio n. 1
0
        public void 数式で表現できる()
        {
            var str = "A + B * C";

            var actual = new Parser(str).Expr();

            var expected =
                new OrResolver(new SingleResolver("A"), new AndResolver(new SingleResolver("B"), new SingleResolver("C")));

            UnityEngine.Debug.Log(actual.ToString());
            UnityEngine.Debug.Log(expected.ToString());

            PatternTest(actual, expected, "A", "B", "C", "D");
        }
Esempio n. 2
0
        public void OrResolver()
        {
            var strs = new[] { "abc", "def", "ghi" };

            var s1 = new SingleResolver("abc");
            var s2 = new SingleResolver("def");
            var s3 = new SingleResolver("yyy");
            var s4 = new SingleResolver("xxx");

            var orS1 = new OrResolver(s1, s2);
            var orF1 = new OrResolver(s3, s4);

            Assert.True(orS1.Resolve(strs));
            Assert.False(orF1.Resolve(strs));
        }
Esempio n. 3
0
        public void Combination()
        {
            var A = new SingleResolver("A");
            var B = new SingleResolver("B");
            var C = new SingleResolver("C");
            var D = new SingleResolver("D");

            // (A and B) or C
            {
                var r1 = new OrResolver(new AndResolver(A, B), C);
                Assert.True(r1.Resolve("C"));
                Assert.True(r1.Resolve("A", "B"));
                Assert.True(r1.Resolve("A", "C"));
                Assert.True(r1.Resolve("B", "C"));
                Assert.True(r1.Resolve("A", "B", "C"));
                Assert.False(r1.Resolve("A"));
                Assert.False(r1.Resolve("B"));
                Assert.False(r1.Resolve());
            }

            // A and ( B or C )
            {
                var r2 = new AndResolver(A, new OrResolver(B, C));
                Assert.True(r2.Resolve(new[] { "A", "B" }));
                Assert.True(r2.Resolve(new[] { "A", "C" }));
                Assert.True(r2.Resolve(new[] { "A", "B", "C" }));
                Assert.False(r2.Resolve(new[] { "B", "C" }));
                Assert.False(r2.Resolve(new[] { "C" }));
                Assert.False(r2.Resolve(new[] { "A" }));
                Assert.False(r2.Resolve(new[] { "B" }));
                Assert.False(r2.Resolve(new string[0]));
            }

            // A and !(B and C)
            {
                var r3 = new AndResolver(A, new NotResolver(new AndResolver(B, C)));
                Assert.True(r3.Resolve(new[] { "A" }));
                Assert.True(r3.Resolve(new[] { "A", "B" }));
                Assert.True(r3.Resolve(new[] { "A", "C" }));
                Assert.False(r3.Resolve(new[] { "A", "B", "C" }));
                Assert.False(r3.Resolve(new[] { "B", "C" }));
                Assert.False(r3.Resolve(new[] { "C" }));
                Assert.False(r3.Resolve(new[] { "B" }));
                Assert.False(r3.Resolve(new string[0]));
            }
        }
Esempio n. 4
0
        public void かっこを含んだ数式で表現できる()
        {
            var str      = "A + ( B * C ) + D";
            var actual   = new Parser(str).Expr();
            var expected =
                new OrResolver(
                    new OrResolver(
                        new SingleResolver("A"),
                        new AndResolver(new SingleResolver("B"), new SingleResolver("C"))),
                    new SingleResolver("D"));


            UnityEngine.Debug.Log("input   : " + str);
            UnityEngine.Debug.Log("expected: " + expected.ToString());
            UnityEngine.Debug.Log("result  : " + actual.ToString());

            PatternTest(actual, expected, "A", "B", "C", "D");
        }
Esempio n. 5
0
        public IResolver Expr()
        {
            var x = Term();
            var c = x;

            while (true)
            {
                switch (Peek())
                {
                case '+':
                    Next();
                    c = new OrResolver(c, Term());
                    continue;
                }
                break;
            }
            return(c);
        }