public void TestIndirectRecursionLoop3() { Grammar g = new Grammar( "parser grammar t;\n" + "s : a ;\n" + "a : i b X ;\n" + // should see through i "b : a B ;\n" + "i : ;\n" + "d : e ;\n" + "e : d ;\n" ); DecisionProbe.verbose = true; // make sure we get all error info ErrorQueue equeue = new ErrorQueue(); ErrorManager.SetErrorListener( equeue ); var leftRecursive = g.GetLeftRecursiveRules(); var expectedRules = new HashSet<string>() { "a", "b", "d", "e" }; Assert.IsTrue( expectedRules.SequenceEqual( ruleNames( leftRecursive ) ) ); Assert.AreEqual(1, equeue.errors.Count); Message msg = equeue.errors[0]; Assert.IsTrue(msg is LeftRecursionCyclesMessage, "expecting left recursion cycles; found " + msg.GetType().Name); LeftRecursionCyclesMessage cyclesMsg = (LeftRecursionCyclesMessage)msg; // cycle of [a, b] ICollection result = cyclesMsg.cycles; var expecting = new HashSet<string>() { "a", "b", "d", "e" }; Assert.IsTrue( expecting.SequenceEqual( ruleNames2( result ) ) ); }
public void TestIndirectRecursionLoop() { Grammar g = new Grammar( "parser grammar t;\n" + "s : a ;\n" + "a : b X ;\n" + "b : a B ;\n" ); DecisionProbe.verbose = true; // make sure we get all error info ErrorQueue equeue = new ErrorQueue(); ErrorManager.SetErrorListener( equeue ); HashSet<Rule> leftRecursive = g.GetLeftRecursiveRules(); //Set expectedRules = // new HashSet() {{add("a"); add("b");}}; var expectedRules = new HashSet<string>(); expectedRules.Add( "a" ); expectedRules.Add( "b" ); Assert.IsTrue( expectedRules.SequenceEqual( ruleNames( leftRecursive ) ) ); Assert.AreEqual(1, equeue.errors.Count); Message msg = equeue.errors[0]; Assert.IsTrue(msg is LeftRecursionCyclesMessage, "expecting left recursion cycles; found " + msg.GetType().Name); LeftRecursionCyclesMessage cyclesMsg = (LeftRecursionCyclesMessage)msg; // cycle of [a, b] ICollection result = cyclesMsg.cycles; var expecting = new HashSet<string>(); //{{add("a"); add("b");}}; expecting.Add( "a" ); expecting.Add( "b" ); Assert.IsTrue( expecting.SequenceEqual( ruleNames2( result ) ) ); }
public void TestimmediateLeftRecursion() { Grammar g = new Grammar( "parser grammar t;\n" + "s : a ;\n" + "a : a A | B;" ); var leftRecursive = g.GetLeftRecursiveRules(); //Set expectedRules = new HashSet() {{add("a");}}; var expectedRules = new HashSet<string>(); expectedRules.Add( "a" ); Assert.IsTrue( expectedRules.SequenceEqual( ruleNames( leftRecursive ) ) ); }
public void TestIndirectLeftRecursion() { Grammar g = new Grammar( "parser grammar t;\n" + "s : a ;\n" + "a : b | A ;\n" + "b : c ;\n" + "c : a | C ;\n" ); var leftRecursive = g.GetLeftRecursiveRules(); //Set expectedRules = new HashSet() {{add("a"); add("b"); add("c");}}; var expectedRules = new HashSet<string>(); expectedRules.Add( "a" ); expectedRules.Add( "b" ); expectedRules.Add( "c" ); Assert.IsTrue( expectedRules.SequenceEqual( ruleNames( leftRecursive ) ) ); }
public void TestCycleInsideRuleDoesNotForceInfiniteRecursion() { Grammar g = new Grammar( "parser grammar t;\n" + "s : a ;\n" + "a : (A|)+ B;\n" ); // before I added a visitedStates thing, it was possible to loop // forever inside of a rule if there was an epsilon loop. var leftRecursive = g.GetLeftRecursiveRules(); var expectedRules = new HashSet<Rule>(); Assert.IsTrue( expectedRules.SequenceEqual( leftRecursive ) ); }