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"); }
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)); }
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])); } }
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"); }
public IResolver Expr() { var x = Term(); var c = x; while (true) { switch (Peek()) { case '+': Next(); c = new OrResolver(c, Term()); continue; } break; } return(c); }