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); }
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"))); }
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)); }
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)); }
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); }