コード例 #1
0
        public void Should_eliminate_all_epsilon_rules_when_converting_grammer_to_chomsky_normal_form()
        {
            var grammar = new ContextFreeGrammar("S");
            grammar.Produce("S", "vA", "vB");
            grammar.Produce("A", "t0");
            grammar.Produce("B");
            grammar.Produce("B", "t1");

            var cnf = grammar.ToChomskyNormalForm();
            var rules = cnf.GetRules("B");

            Assert.That(rules, Has.None.Empty);
        }
コード例 #2
0
        public void Should_eliminate_all_unit_rules_when_converting_grammer_to_chomsky_normal_form()
        {
            var grammar = new ContextFreeGrammar("S");
            grammar.Produce("S", "vA", "vB");
            grammar.Produce("A", "vB");
            grammar.Produce("B", "t1");

            var cnf = grammar.ToChomskyNormalForm();
            var rules = cnf.GetRules("A");

            Debug.WriteLine(cnf);

            Assert.That(rules.Single().Single(), Is.Not.EqualTo(new Variable("B")));
        }
コード例 #3
0
 public void Should_not_convert_grammar_to_chomsky_normal_form_if_it_is_already_in_chomsky_normal_form()
 {
     var grammar = new ContextFreeGrammar("S");
     Assert.That(grammar.IsInChomskyNormalForm, Is.True);
     Assert.That(grammar.ToChomskyNormalForm(), Is.SameAs(grammar));
 }
コード例 #4
0
        public void Should_transform_all_rules_into_proper_form_when_converting_grammer_to_chomsky_normal_form()
        {
            var grammar = new ContextFreeGrammar("S");
            grammar.Produce("S", "t1", "t2", "t3");

            var cnf = grammar.ToChomskyNormalForm();
            var rules = cnf.GetRules("S");

            Assert.That(rules.Select(r => r.ToList()), Has.All.Count.LessThanOrEqualTo(2));
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: oliverhanappi/computation
        public static void Main()
        {
            var grammer = new ContextFreeGrammar("S")
                .Produce("S", "vA", "t1", "vA")
                .Produce("A")
                .Produce("A", "vS")
                .Produce("A", "vA", "t0", "vS")
                .Produce("A", "vS", "t0", "vA");

            Console.WriteLine(grammer);
            TopDownParser parser = grammer;

            Console.WriteLine(grammer.ToChomskyNormalForm().ToString());

            Measure.AndDisplayPerformance("comparison", () =>
            {
                Console.Write("Starting comparison.. ");

                var allWords1 = Permute.AllWordsOver(7, '0', '1').Where(w => w.Where(c => c == '0').Count() < w.Where(c => c == '1').Count()).ToArray();
                var allWords2 = parser.Language(7).ToArray();

                foreach (var word in allWords1)
                {
                    if (!allWords2.Contains(word))
                    {
                        Console.WriteLine("Word {0} not enumerated.", word);
                    }

                    if (!parser.Compute(word))
                    {
                        Console.WriteLine("Word {0} not accepted.", word);
                    }
                }

                Console.WriteLine("Finished.");
            });

            Console.ReadKey(true);

            var stopwatch = Stopwatch.StartNew();
            parser.Compute("001101110");
            Console.WriteLine("Computing '001101110' took {0} ms.", stopwatch.ElapsedMilliseconds);

            //Console.ReadKey(true);

            var performance = Measure.Performance(() => {
            foreach (var word in parser.Language(8))
            {
                var zeros = word.Where(c => c == '0').Count();
                var ones = word.Where(c => c == '1').Count();

                if (ones <= zeros)
                    throw new ArgumentException();

                Console.WriteLine(word);
            }});

            Console.WriteLine("Enumeration took {0} ms", performance.TotalMilliseconds);

            //Console.ReadKey(true);
        }