Ejemplo n.º 1
0
        public void TestProduce(string startSymbol, string expectedSequence)
        {
            SymbolsSet<string> s = new SymbolsSet<string>(new[]
                {
                    new Symbol<string>("x", "x"),
                    new Symbol<string>("y", "y"),
                    new Symbol<string>("sin", "sin"),
                    new Symbol<string>("atan", "atan"),
                    new Symbol<string>("sum", "sum"),
                    new Symbol<string>("mul", "mul"),
                    new Symbol<string>("A0"),
                    new Symbol<string>("A1"),
                    new Symbol<string>("A2"),
                    new Symbol<string>("Inf")
                });

            Rule<string>[] rules =
            {
                // A0 -> x|y
                new OrRule<string>(s["A0"], new [] { s["x"], s["y"] }),

                // A1 -> (sin A1)|(atan A1)|(sin A2)|(atan A2)
                new OrRule<string>(s["A1"],
                    new []
                    {
                        new Rule<string>(new []{ s["sin"], s["A1"] }),
                        new Rule<string>(new []{ s["atan"], s["A1"] }),
                        new Rule<string>(new []{ s["sin"], s["A2"] }),
                        new Rule<string>(new []{ s["atan"], s["A2"] })
                    }),

                // A2 -> sum A0 A0
                new Rule<string>(s["A2"],
                    new []
                    {
                        s["sum"], s["A0"], s["A0"]
                    }),

                // Inf -> sum Inf
                new Rule<string>(s["Inf"],
                    new []
                    {
                        s["sum"], s["Inf"]
                    })
            };

            Grammar<string> grammar = new Grammar<string>(rules);
            IEnumerable<string> sequence = grammar.Produce(startSymbol).Take(10);
            Assert.AreEqual(expectedSequence, string.Join(" ", sequence.ToArray()));
        }