Пример #1
0
        public void ShouldFeedAndReduceUsingAnyTerminalPredicate()
        {
            Automaton automaton;
            IAutomatonTable <char>  automatonTable;
            INonTerminalNode <char> node;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "B*=abc;", "A*=a.c;" });
            automaton      = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);
            Assert.IsTrue(automaton.CanAccept());
            node = automaton.Accept();
            Assert.AreEqual("B", node.Input.Name);

            automaton.Feed('a');
            automaton.Feed('c');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);
            Assert.IsTrue(automaton.CanAccept());
            node = automaton.Accept();
            Assert.AreEqual("A", node.Input.Name);
        }
Пример #2
0
        public void MayNotAcceptUsingReduction()
        {
            Automaton automaton;
            INonTerminalNode <char> node;
            IAutomatonTable <char>  automatonTable;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A=abc;", "B=def;", "E*={A}|{B};" });

            automaton = new Automaton(automatonTable);

            Assert.IsFalse(automaton.CanAccept());
            Assert.ThrowsException <InvalidOperationException>(() => automaton.Accept());
            automaton.Feed('a');
            Assert.IsFalse(automaton.CanAccept());
            Assert.ThrowsException <InvalidOperationException>(() => automaton.Accept());
            automaton.Feed('b');
            Assert.IsFalse(automaton.CanAccept());
            Assert.ThrowsException <InvalidOperationException>(() => automaton.Accept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            node = automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());

            Assert.AreEqual("E", node.Input.Name);
            Assert.AreEqual(1, node.Nodes.Count());
        }
Пример #3
0
        public void ShouldFeedAndReduceLeftRecursiveRules()
        {
            Automaton automaton;
            IAutomatonTable <char> automatonTable;


            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=a{S}a;", "S={S}b;", "S=c;" });
            automaton      = new Automaton(automatonTable);

            // aca
            automaton.Reset();
            automaton.Feed('a');
            automaton.Feed('c');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('a');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());


            // acba
            automaton.Reset();
            automaton.Feed('a');
            automaton.Feed('c');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('b');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('a');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());

            // acbbba
            automaton.Reset();
            automaton.Feed('a');
            automaton.Feed('c');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('b');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('b');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('b');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('a');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
        }
Пример #4
0
        public void ShouldFeedAndReduceGreedy()
        {
            Automaton automaton;
            IAutomatonTable <char>  automatonTable;
            INonTerminalNode <char> node;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=ab{C}*;", "C=c;" });

            automaton = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            Assert.IsTrue(automaton.CanAccept());

            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());

            node = automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
        }
Пример #5
0
        public void ShouldFeedGreedy()
        {
            Automaton automaton;
            IAutomatonTable <char>  automatonTable;
            INonTerminalNode <char> node;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=abc*;" });

            automaton = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);
            Assert.IsTrue(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            node = automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
            Assert.AreEqual(6, node.Nodes.Count());
        }
Пример #6
0
        public void ShouldAccept()
        {
            Automaton automaton;
            INonTerminalNode <char> node;
            IAutomatonTable <char>  automatonTable;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=abc;" });

            automaton = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);
            Assert.IsTrue(automaton.CanAccept());
            node = automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());


            Assert.AreEqual(3, node.Nodes.Count());
            Assert.AreEqual(0, automaton.StackCount);
            // ensure that child order is correct
            Assert.AreEqual('a', ((TerminalNode <char>)node.Nodes.ElementAt(0)).Input.Value);
            Assert.AreEqual('b', ((TerminalNode <char>)node.Nodes.ElementAt(1)).Input.Value);
            Assert.AreEqual('c', ((TerminalNode <char>)node.Nodes.ElementAt(2)).Input.Value);
        }
Пример #7
0
        public void ShouldRecursiveAccept()
        {
            Automaton automaton;
            IAutomatonTable <char> automatonTable;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=ab{B};", "B={C};", "C={D};", "D=c;" });
            automaton      = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);

            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
        }
Пример #8
0
        public void ShouldFeedAndReduceUsingTerminalRange()
        {
            Automaton automaton;
            IAutomatonTable <char> automatonTable;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=a{B}[c-z];", "B=b;" });
            automaton      = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);

            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
        }
Пример #9
0
        public void ShouldReturnCanAccept()
        {
            Automaton automaton;
            IAutomatonTable <char> automatonTable;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=abc;" });

            automaton = new Automaton(automatonTable);
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('a');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('b');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('c');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
        }
Пример #10
0
        public void ShouldFeedAndReduce()
        {
            Automaton automaton;
            IAutomatonTable <char> automatonTable;

            automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=a{BCD}e;", "BCD=b{C}d;", "C=c;" });
            automaton      = new Automaton(automatonTable);

            automaton.Feed('a');
            automaton.Feed('b');
            automaton.Feed('c');
            Assert.AreEqual(3, automaton.StackCount);

            Assert.IsFalse(automaton.CanAccept());

            automaton.Feed('d');
            Assert.IsFalse(automaton.CanAccept());
            automaton.Feed('e');
            Assert.IsTrue(automaton.CanAccept());
            automaton.Accept();
            Assert.IsFalse(automaton.CanAccept());
        }