GetLeftRecursiveRules() public method

public GetLeftRecursiveRules ( ) : HashSet
return HashSet
        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 ) );
 }